第一周我的学习计划是先依据《大话数据结构》这本书的顺序学习,因为我觉得这本书的内容是先易后难的。先讲的是一些总体的介绍帮助我对这本书的内容有个大致的了解,然后前还有一些前置的基本知识,只有先看懂前面的才能帮助我更好的理解后面的内容。
我这周学到了第三章线性表+第五章串。主要学习的《算法》中的时间复杂度;《线性表》中的线性表的顺序存储结构、线性表的链式存储结构、单链表的操作、静态链表、循环链表、双向链表;《串》中的串的比较、串的Index操作、朴素模式匹配算法、KMP模式匹配算法、KMP优化数组nextval。
一、《算法》
1.时间复杂度:分析算法语句执行总次数的函数。
主要掌握推导大O阶的方法:1.用常数1取代所有加法常数;2.直播阿瑠最高阶项;3.如果最高项存在且不是1,除去这项系数。
二、 《线性表》
1.线性表:零个或多个数据元素的有限序列。
2.线性表的顺序存储结构:用一段地址连续的存储单元依次存储线性表的数据元素。
描述顺序存储的三个属性:1.存储空间的起始位置;2.线性表的最大存储量;3.线性表的当前长度。
3.线性表的链式存储结构; 用一组任意的存储单元存储线性表的数据元素。
线性表的链式存储结构中的数据元素不仅需要数据域存储自身信息还要指针域存储直接后继信息。
4.单链表操作:
读取GetElem:1.声明一个结点p 指向链表的第一个结点;2.当j < i 时,就遍历链表,指针后移,计数器加 1;3.若到链表末尾,p 为空,则 第 i 个元素不存在;4.否则成功,返回结点 p 的数数据。
插入ListInsert:1.查找到第 i 个元素,并生成空结点S;2.更新S,插入【s->next = p->next;p->next = s】。
删除ListDelete:1.先查找到第 i 个元素,赋值给q;2.删除【p->next = q->nxet
】;3.释放 q。
单链表的创建:创建单链表的过程就是一个动态生成链表的过程,即依次建立各元素结点,并逐个插入链表。【头插法 / 尾插法】。
5.静态链表:用数组代替指针,来描述单链表。即数组元素由两个数据域组成,data,cur(相当于链表的指针)。为了辨明数组中哪些分量未被使用,我们需要将所有未被使用过的及已被删除的分量用游标链成一个备用的链表,每当进行插入时,便可以从备用链表上取得第一个结点作为待插入的新结点。
6.循环链表:将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环。
7.双向链表:双向链表是在单链表的每个结点中,再设置一个指向其前驱结点的指针域。
三、 《串》:串(string)是由零个或多个字符组成的有限序列(字符串)。
1.串的比较:通过字符之间的ASCII码值进行比较。从第一个字符开始只要一位ASCII码值大的就大,小的就小,若全都相等且长度也相等,则两个字符串就相等。
2.串的Index(S,T,pos)操作:1.得到主串S和子串T长度;2.从主串i个位置长度与T相等给sub,SubString(sub,S,T,m).3.如果两串不相等则继续遍历主串,否则返回i。
3。朴素模式匹配算法:对主串的每一个字符作为子串开头,与要匹配的字符串进行匹配。对主串做大循环,每个字符开头做T的长度的小循环,直到匹配成功或全部遍历完成为止。
4.KMP模式匹配算法:KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)。
5.nextval:我们可以通过一次匹配信息,知道模式串中必定与主串当前索引位置不匹配的值—— a ,所以如果我们通过 next[] 找到的值也为 a 的话,我们直接知道也必定匹配不成功,将往前继续查找能匹配的值。
总结:《大话数据结构》的前两章都是基础知识引入,线性表总体不难,就是链表的操作代码实现需要多去手打实践加深理解和熟练,并且线性表中的两种结构是后面数据结构的基础,需要着重理解掌握,打好基础。串的朴素模式匹配算法是一般的算法比较简单易懂,但是KMP匹配算法较难理解,KMP算法在朴素算法之上进行了很好的优化,特别是需要结合next和nextval数值推导去仔细理解,理解好了这个KMP就很好理解了。这一周的自习充实又忙碌,很大程度上锻炼了我的学习的耐心和自主学习的能力。