稀疏多项式的运算
問(wèn)題描述:
??已知稀疏多項(xiàng)式Pn(X)=c1x^e1+c2x^e2+....+cmx^em,其中n=em>em-1>....>e1>=0;?ci!=0,m>=1.試采用存儲(chǔ)量同多項(xiàng)式項(xiàng)數(shù)m成正比的順序存儲(chǔ)結(jié)構(gòu),編寫(xiě)求Pn(x0)的算法(x0為給定值),并分析你的算法的時(shí)間復(fù)雜度。
問(wèn)題分析:
多項(xiàng)式的順序存儲(chǔ)結(jié)構(gòu)為:
Typedef?struct?{
Int??coef;
Int??exp;
}PolyTerm;
Typedef?struct{
PolyTerm??*data;
Int??length;
}SqPoly;//多看下,加深理解結(jié)構(gòu)體
什么叫做存儲(chǔ)量同多項(xiàng)式項(xiàng)數(shù)m成正比的順序存儲(chǔ)結(jié)構(gòu)?這意味著隨著m的增大,存儲(chǔ)量增加,好吧,這句話貌似沒(méi)用。主要是求值了。看了代碼后,挺容易理解的,自己還不知道這樣做就行了。
?
緊接著下一題是編寫(xiě)求P(x)=Pn1(x)-Pn2(x)的算法
問(wèn)題分析:
這道題算是兩個(gè)多項(xiàng)式的組合?差不多,剛開(kāi)始想覺(jué)得很多沒(méi)想到,你一旦你開(kāi)始想,理清楚其中的細(xì)節(jié),這道題也就解出來(lái)了。
Status?PolyMinus(SqPoly??&L,??SqPoly?&L1,?SqPoly??&L2)
{
???PolyTerm??*p,?*p1,*p2;
???P=L.data;
???P1=L1.data;
???P2=L2.data;
Int?i=0,j=0,k=0;
While(i<L1.length&&j<L2.length)
{
??If(p1->exp==p2->exp)
??{
??????
????????P->coxl=(p1->cox1)-(p2->coxl);
????????P->exp=p1->exp;
????????P1=p1->next;?p2=p2->next;
????????P=p->next;
????????I++;??j++;k++;
???????
??}
?Else?
?{?
???P->coxl=p1->coxl;
???P->exp=p1->exp;
???P=p->next;
???P1=p1->nextl
???I++;
???K++;
???P->cox1=-(p2->coxl);
???P->exp=p2->exp;
???P=p->next;
???P2=p2->nextl
???j++;
???K++;?
?}
}
L.length=k;
Return?ok;
}
//coxl也就是coef?我弄錯(cuò)了。
//自己寫(xiě)的算法雖然實(shí)現(xiàn)了大概的功能,但是沒(méi)考慮到順序,以及兩項(xiàng)相減后為0的情況,它會(huì)自動(dòng)消失?還有當(dāng)兩個(gè)表的長(zhǎng)度不相等時(shí)?While循環(huán)跳出來(lái)就執(zhí)行完了嗎?還要進(jìn)一步判斷呢。。這個(gè)可能還是要細(xì)分,也就是說(shuō)我的這個(gè)算法,考慮的情況不多,分類討論的思想是很重要的,高中的數(shù)學(xué)題很多就是需要分類討論,這個(gè)思想要培養(yǎng)出來(lái)。
參考書(shū)上的代碼:
Status?PolyMinus(SqPoly??&L,??SqPoly?&L1,?SqPoly??&L2)
{
???PolyTerm??*p,?*p1,*p2;
???P=L.data;
???P1=L1.data;
???P2=L2.data;
???Int?i=0,j=0,k=0;
???While(i<L1.length&&j<L2.length)
{
??If((p1->exp)>(p2->exp))
??{
??????P->coxl=?-?(p2->coxl);
??????P->exp=p2->exp;
??????p2=p2->next;
??????P=p->next;
??????j++;k++;
?}??
Else
{
????If((p1->exp)<(p2->exp))
????{
??????P->coxl=(p1->coxl);
??????P->exp=p1->exp;
??????P1=p1->next;
??????P=p->next;
??????i++;k++;
?????}??
????Else{
??????????If(p1->coxl!=p2->cox1)
??????????{
????????????P->coxl=(p1->cox1)-(p2->coxl);
????????????P->exp=p1->exp;
????????????P=p->next;
????????????k++;
??????????}
???????P1=p1->next;?
???????p2=p2->next;
???????I++;??j++;
??????}
}//else
}//while
While(i<L1.length)
{
??????P->coxl=(p1->coxl);
??????P->exp=p1->exp;
??????P1=p1->next;
??????P=p->next;
??????i++;k++;
}
While(j<L2.length)
{
??????P->coxl=?-?(p2->coxl);
??????P->exp=p2->exp;
??????p2=p2->next;
??????P=p->next;
??????j++;k++;
}
?
L.length=k;
Return?ok;
}
轉(zhuǎn)載于:https://www.cnblogs.com/wj204/archive/2013/04/26/3044284.html
總結(jié)
- 上一篇: Day6作业
- 下一篇: 1.给定区间的二分查找