• 稀疏多项式的运算


    问题描述:

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

    }

  • 相关阅读:
    btrfs基础
    解决debian编辑器vim没有颜色的问题
    [转载]RHEL-6启动时提示:“/usr/libexec/gconf-sanity-check-2 exited with status 256”
    [转载]vim E667: Fsync failed
    Windows Server 2003修改远程桌面连接数
    [转载]"由于这台计算机没有远程桌面客户端访问许可证,远程会话被中断"的解决方案
    [转载]远程登录提示"*已经被拒绝登录到终端*"
    ESXi开启SSH的方法总结
    glibc 编译安装( version `GLIBC_2.14' not found")
    [转载]Wireshark基本介绍和学习TCP三次握手
  • 原文地址:https://www.cnblogs.com/wj204/p/3044284.html
Copyright © 2020-2023  润新知