稀疏多项式的运算
问题描述:
已知稀疏多项式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的增大,存储量增加,好吧,这句话貌似没用。主要是求值了。看了代码后,挺容易理解的,自己还不知道这样做就行了。
紧接着下一题是编写求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;
}