标签:sizeof 结束 lock end lse 技术 image 指针 int
最近真是被数字逻辑电路和高数折磨得够呛。
抽出时间
坚持更新!
今天我们谈一谈凡是谈链表都一定会提到的多项式问题。
定义多项式F(X)=∑ni=0aiXi,我们如何在计算机中储存这个多项式?
显然,假设这个多项式有n项,我们需要一个大小为n的数组来储存所有的系数,便可以通过简单的数组遍历以及简单运算来完成多项式的运算等任务。
现在思考一个问题。
编写程序计算多项式F(X)=X+X100与G(X)=X+X101的和与积。
现在我们分析一下用数组实现的过程,画手登场!
首先是和,计算过程应该是对两个数组进行遍历,对每个下标相同的的元素内的值进行加法运算,如果结果不为0则输出和以及对应X的幂
如果我们忽略进行加法运算所需的时间,将遍历时标志物自增所需的时间定为单位时间i,经过计算可以得出,这一个计算和的操作所需时间为201i
现在再来看乘法运算,时间需要多少?
同样,我们忽略进行乘法运算以及合并同类项所需的时间,这个操作需要两个for循环的嵌套,所需时间为100*101i,可以发现时间大量增加。
事实上,无论是加法还是乘法运算,使用数组对多项式进行操作时,将会有大量时间耗费在对0系数项的遍历上,尤其是当一个多项式0项很多时。
而事实上,这些0项并没有参与计算,只是徒增了检查0项而消耗掉的时间。
既然没有参与计算,那能不能不储存他们呢?
简单数组是无法实现的,因为其对X指数的判断与数组下标有关,所以无法去掉任何一项。
回到刚才的题目
编写程序计算多项式F(X)=X+X100与G(X)=X+X101的和与积。
这个计算初中生小明都会,和就是同类项合并,积就是先交叉相乘再合并同类项就可以了,他根本不会想到0项。
我们使用链表的话也可以做到这一点,只储存非0项。
不过这个时候链表中的结点不仅仅只含一个值了,含有一个项的系数以及指数以及指向下一项的指针。
typedef struct DXHnode{ int index;//指数 float coef;//系数 struct DXHnode * next; }D_Node; typedef struct{ D_Node *head; }Dxs;
知识基础:结构,类型
下面是从键盘读取并创建多项式链表的具体操作。(欢迎指正与批评)
typedef struct DXHnode{ int index;//指数 float coef;//系数 struct DXHnode * next; }D_Node; typedef struct{ D_Node *head; }Dxs; void creat_dxs(Dxs*a){ int indexx; float coeff; int n=1; printf("接下来,请根据提示输入多项式每一项的指数和系数,当输入的系数为0时结束判断输入结束\n"); while (1) { printf("请输入第%d项的系数和指数,用空格号隔开\n",n); scanf("%f %d",&coeff,&indexx); if (coeff) { D_Node*p=(D_Node*)malloc(sizeof(D_Node)); n++; p->index=indexx; p->coef=coeff; p->next=NULL;//创造出一个结点 D_Node*last=a->head; if(last){ while(last->next) last = last->next; last->next=p; } else a->head=p; } else { printf("end of entering\n");break; } } }
现在,我们终于可以像小明一样简单的进行计算了!
现在和与积运算需要多少时间呢?
2i(遍历时间)
计算时间和数组的相同。
成功避免了在0项上浪费时间。
谢谢阅读!
标签:sizeof 结束 lock end lse 技术 image 指针 int
原文地址:https://www.cnblogs.com/clclcl/p/9870356.html