稀疏多项式的运算
問題描述:
??已知稀疏多項式Pn(X)=c1x^e1+c2x^e2+....+cmx^em,其中n=em>em-1>....>e1>=0;?ci!=0,m>=1.試采用存儲量同多項式項數m成正比的順序存儲結構,編寫求Pn(x0)的算法(x0為給定值),并分析你的算法的時間復雜度。
問題分析:
多項式的順序存儲結構為:
Typedef?struct?{
Int??coef;
Int??exp;
}PolyTerm;
Typedef?struct{
PolyTerm??*data;
Int??length;
}SqPoly;//多看下,加深理解結構體
什么叫做存儲量同多項式項數m成正比的順序存儲結構?這意味著隨著m的增大,存儲量增加,好吧,這句話貌似沒用。主要是求值了??戳舜a后,挺容易理解的,自己還不知道這樣做就行了。
?
緊接著下一題是編寫求P(x)=Pn1(x)-Pn2(x)的算法
問題分析:
這道題算是兩個多項式的組合?差不多,剛開始想覺得很多沒想到,你一旦你開始想,理清楚其中的細節,這道題也就解出來了。
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?我弄錯了。
//自己寫的算法雖然實現了大概的功能,但是沒考慮到順序,以及兩項相減后為0的情況,它會自動消失?還有當兩個表的長度不相等時?While循環跳出來就執行完了嗎?還要進一步判斷呢。。這個可能還是要細分,也就是說我的這個算法,考慮的情況不多,分類討論的思想是很重要的,高中的數學題很多就是需要分類討論,這個思想要培養出來。
參考書上的代碼:
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;
}
轉載于:https://www.cnblogs.com/wj204/archive/2013/04/26/3044284.html
總結
- 上一篇: Day6作业
- 下一篇: 1.给定区间的二分查找