稀疏多项式的运算

问题描述:

  已知稀疏多项式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;

}

原文地址:https://www.cnblogs.com/wj204/p/3044284.html