好久以前就想认真学习下数据结构了,一直。。。
经过多方面对比,我选择的课程是中国大学MOOC上的浙江大学《数据结构》课程,由陈越、何钦铭老师主讲。
❤ 2020.10.19 ❤
❤ 2021.9.27 ❤
基本概念
第一章是概述,里面介绍了c语言的一个clock()函数
给算法下了个定义
评判算法好坏的指标
不同时间复杂度的算法的效率
以及变化曲线
然后说:一个程序员在遇到时间复杂度为
n
2
n^{2}
n2时,要考虑是不是可以把复杂度降到nlogn。
然后举了个例子:
最大子列和问题
然后介绍了四种方法:
1、暴力计算法,把所有情况都遍历一遍,求出最大值,时间复杂度
O
(
n
3
)
O(n^{3})
O(n3)。
2、优化的暴力计算法,减少一层循环,时间复杂度
O
(
n
2
)
O(n^{2})
O(n2)。
3、分而治之法,就是二分法,使用递归的方法,将每次判断的范围一分为二,时间复杂度
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)。
4、在线处理,相当于每传入一个数据就进行处理,只需读取整个数组一遍,算法原则是:首先子列不断做累加运算,当子列和为负时就抛弃使其为0,子列和大于当前最大子列和时就替换,时间复杂度为
O
(
n
)
O(n)
O(n)。
最大连续子数列和
❤ 2021.9.27 ❤
线性结构
线性表
线性表的顺序存储
线性表的操作:(我就不贴了,可以去PPT里面找)
1、初始化
2、查找
3、插入
插入操作需要把插入位置后的元素全部往后挪,挪之前要判断线性表是不是满了。
4、删除
删除需要把删除位置之后的元素全部往前挪(好麻烦)。
线性表的链式存储
操作:
1、求表长:
遍历
2、查找:按序号查找,按值查找
遍历
3、插入
4、删除
修改指针之后要释放内存空间
广义表
多重链表
然后举了一个例子,是用十字链表表示系数矩阵
在这里左上角的term节点是整个矩阵的入口,里面记录了矩阵的长宽以及非零节点的数量。
head节点是每行每列的入口,为了让整个矩阵节点的形式统一,使用共用体来存储,用tag区分
堆栈
后缀表达式
首先介绍了一个叫后缀表达式的东西
使用栈来存储运算
栈
注意:插入的时候要判断栈有没有满,删除的时候判断是否为空。
栈可以用一个一位数组来实现
也可以用链式存储来实现
需要建立一个栈头结点,删除节点之前要判断栈空不空,并记得释放内存。
然后举了个例子,应用栈的方法将中缀表达式转换成后缀表达式
队列
下面是队列,队列和堆栈的区别就是先入先出
队列也可以分别用顺序存储和链式存储两种方式实现
顺序存储可以以循环队列的方式存在
这样的队列判断是否存满时不能直接判断头指针和尾指针的相对位置,可以用
1、额外的标记,比如一个数值存储元素的个数,或者一个标记存储最后一次是存还是取
2、n个位置只存储n-1个元素。
使用链表实现队列,要注意front指针要在链表头,因为front是用来实现删除操作,rear是用来插入的。
最后讲了个例子,是用链表实现多项式运算,很有实际意义!