c++数据结构一元多项式_小周的数据结构笔记

数据结构差不多是所有CS考研同学的必考专业课,尤其是考408(浙大 中科大 上交 北航等等都是呢-o-)的小伙伴。也是所有面试算法岗的童鞋不可逃避的一门课。这个笔记是参考浙大陈越姥姥的那门数据结构,在B站有相关的网课视频,但是清华大学计算机考研912的数据结构中要考的红黑树 B树等相关考点却没有涉及到,这里也会相应作出补充。同时也会在Github上传调试过的源码,需要PPT的同学可以私信我。在接下来一段时间,我会在业余时间慢慢更新整理补充这个Note。

数据结构-浙江大学 陈越、何钦铭​www.bilibili.com

课程地址:https://www.icourse163.org/course/ZJU-93001

这里我的IDE用的是VScode,零基础跨考的同学先去学习基本的C语言的语法,我这里全部都是用C完成的相关作业。


第一章:数据结构基本概念

1.1.1、数据结构的定义:这里没有统一的定义

如下两种描述

  1. “数据结构是数据对象,以及存在于该对象的实例和组成实例的数据元素之间的各种联系。这些联系可以通过定义相关的函数来给出。” ——Sartaj Sahni《数据结构、算法与应用》
  2. “数据结构是ADT(抽象数据类型Abstract Data Type)的物理实现。” ——Clifford A.Shaffer《数据结构与算法分析》
  3. (这里我自己认为数据结构大概是对具体问题的成员进行的抽象~~~)

1.1.2、关于空间使用

demo1.1.2:

实现一个函数PrintN,使得传入一个正整数为N的参数后,能顺序打印从1到N的全部正整数

d3d508b8214061e6a2e10c537e7c7353.png
循环实现

cdae1a0392f7939af5ae94c735cba872.png
递归实现

这里当N的规模为100000时,递归实现的程序会发生error(原因是爆栈了!)

解决问题方法的效率,跟空间的利用效率有关。(但是在数据结构这门课中,对于空间复杂度的讨论远远没有时间复杂度的多 O。O)

1.1.3、关于算法效率

demo1.1.3:

计算多项式在给定点x处的值f(x)=an·x^n+an-1·x^(n-1)+…+a2·x^2+a1·x+a0

9a9c219ae51b2a3dd7aedf6b77a4632b.png

e78e1cf826fa56ee5a236fb8c917d2cf.png
MAXN=1e6时

1.1.4、抽象数据类型

所以到底什么是数据结构???

数据对象在计算机中的组织方式

  1. 逻辑结构
  2. 物理存储结构

数据对象必定与一系列加在其上的操作相关联,完成这些操作所用的方法就是算法。

抽象数据类型(Abstract Data Type)

  • 数据类型:(1.数据对象集 2.数据集合相关联的操作集)
  • 抽象:描述数据类型的方法不依赖于具体实现(1.与存放数据的机器无关 2.与数据存储的物理结构无关 3.与实现操作的算法和编程语言均无关)

1.2.1、算法(Algorithm)的定义

  • 一个有限指令集
  • 接受一些输入(有些情况下不需要输入)
  • 产生输出
  • 一定在有限步骤之后终止
  • 每一条指令必须有充分明确的目标,不可以有歧义,计算机能处理的范围之内,描述手段要抽象而不是依赖于任何一种计算机语言以及具体的实现手段

1.2.2、算法的衡量指标

  • 空间复杂度S(n)
  • 时间复杂度T(n)

1.2.3、时间复杂度的渐进表示法

算法(一)时间复杂度_BATcoder - 刘望舒-CSDN博客_时间复杂度

算法的时间复杂度和空间复杂度-总结_zolalad的专栏-CSDN博客_时间复杂度

for、while等循环的时间复杂度计算较为容易,这里比较头疼的是递归的时间复杂度的计算,这个参考最最最经典的Thomas H. Cormen、Charles E. Leiserson几个人那本《Introduction to Algorithms》的内容,通过主定理来分析递归表达式的渐近复杂度。

主定理的证明及应用举例

这里关于递归表达式的时间复杂度的计算也可以参考天勤考研数据结构的网课中对于递归算法复杂度分析部分。这里倒是没怎么讨论关于空间复杂度的问题,408数据结构部分的真题还是比较喜欢考察复杂度的计算。

21考研天勤数据结构​www.bilibili.com

第二章:线性表(顺序表,链表)

顺序表

ca1f74940fb703da802a83951514466f.png

f3d5f92eb98276422b3a2625e59f7d71.png
执行结果

链表

53f9a02f06178dc22f69dd7891d5b26c.png

c314c965d7a79fb7b36c958e045a4b7e.png
执行结果
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 一元多项式相加是在数据结构中比较基础的一部分,也是我们在数学中常见的操作。在计算机中,我们通常将多项式看作一个数组(或链表)的形式,其中数组下标表示该项的指数,数组中存放的值表示该项的系数。两个多项式相加就是将两个数组对应项的系数相加得到一个新的数组。 具体步骤如下: 1. 定义一个数组(或链表)来存放结果多项式,长度为两个原始多项式中指数最大的项数加1。 2. 遍历两个原始多项式数组(或链表),将对应项的系数相加,赋值给结果数组的对应项。 3. 返回结果数组(或链表)。 当然,在实现过程中还需注意以下几点: 1. 若某个多项式存在系数为0的项,则计算时应该忽略该项,即不将其对应项相加到结果数组中。 2. 当两个原始多项式不等长时,需在系数较短的数组中补0,使其长度与较长数组相等。 3. 若相加的结果系数为0,则结果多项式也应该忽略该项,即不将其加入到结果数组中。 总之,一元多项式的加法并不复杂,只需遍历数组,将对应项的系数相加即可。需要注意的是,在实现过程中考虑越界以及忽略系数为0的项这些问题。 ### 回答2: 一元多项式的运算主要包括加、减、乘和求导等,其中加法是最基本的一种运算。在数据结构中,我们可以用链表来表示一元多项式,在链表中每个结点表示一个单项式,包含系数和指数两个数据项。对于两个一元多项式的相加,则需要对它们的各个单项式进行合并,合并的方法是按照单项式的指数大小进行排序,然后分别将同一指数的单项式的系数相加得到新的单项式,最终得到一个新的一元多项式。 具体实现上,可以通过定义一个新的链表来存储结果,然后使用两个指针分别遍历两个原始的链表,根据两个指针所对应的单项式的指数关系来决定需要将哪个单项式加入到结果链表中。需要注意的是,在遍历的过程中,如果出现同一指数的单项式,则需要将它们的系数相加得到新的单项式,否则直接将单项式插入结果链表中即可。 在实现过程中,可以使用一个小技巧来简化代码,即使用一个哑结点作为结果链表的头结点,这样就可以省略对链表进行空判断的代码。同时,为了提高运算效率,可以对原始链表进行排序,使得它们的单项式按照指数大小排列,从而便于遍历和合并。 综上所述,一元多项式的相加需要按照单项式的指数大小进行排序,然后遍历两个原始链表,合并同一指数的单项式并插入结果链表中,最终得到一个新的一元多项式。具体实现需要考虑空链表和排序等细节问题。 ### 回答3: 一元多项式相加是数据结构中的一个重要问题。我们需要定义一个多项式的结构体,同时考虑到指数可能不是连续的整数,我们需要使用链表来保存每一项的系数和指数。具体来说,结构体的定义如下: ```c typedef struct node { int coefficient; // 系数 int exponent; // 指数 struct node* next; // 下一项 } polynomial; ``` 接下来,我们可以先将两个多项式按指数从小到大排序,然后使用“归并”算法将它们相加。具体来说,分别遍历两个多项式的链表,按指数大小比较,将系数较小的项插入结果链表,并且修改指针。最后,如果有多余项,直接将它们接在结果链表的末尾即可。 具体实现如下: ```c polynomial* add(polynomial* p1, polynomial* p2) { polynomial* result = (polynomial*)malloc(sizeof(polynomial)); polynomial* cur = result; while (p1 && p2) { if (p1->exponent < p2->exponent) { cur->next = p1; p1 = p1->next; } else if (p1->exponent > p2->exponent) { cur->next = p2; p2 = p2->next; } else { cur->next = p1; cur->next->coefficient += p2->coefficient; p1 = p1->next; p2 = p2->next; } cur = cur->next; } cur->next = p1 ? p1 : p2; return result->next; } ``` 最后,记得要释放内存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值