我在准备21年408考研的过程中,根据王道考研书的内容、linjiafengyang的总结和其它相关资料,将数据结构的知识点总结如下。大家复制后可以根据自身需求增删知识点、打印成册以方便学习。其中一些公式和特殊符号可能无法正确显示,可以点击此处(csdn要积分)下载docx文件查看,也可以点这里下载(提取码:s2do)。
1.1 数据结构的基本概念
数据元 是数据的基本单位,一个 数据元素 可由若干个 数据项 完成, 数据项 是构成 数据元素 的不可分割的最小单位。例如,学生记录就是一个数据元素,它由学号、姓名、性别等数据项组成。
数据对象 是具有 相同性质的数据元素 的集合,是数据的一个子集。
数据类型 是一个值的集合和定义在此集合上一组操作的总称。
抽象数据类型(ADT )是指一个数学模型以及定义在该模型上的一组操作。抽象数据类型的定义仅取决于它的一组逻辑特性 ,而与其在计算机内部如何表示和实现无关。通常用( 数据对象、数据关系、基本操作集 )这样的三元组来表示。
#关键词:数据,数据元素,数据对象,数据类型,数据结构
数据结构的三要素:
1.2 算法和算法评价
算法是对特定问题求解步骤的一种描述,有五个特性: 有穷性、确定性、可行性、输入、输出 。一个算法有 零个或多个的输入 ,有 一个或多个的输出 。
时间复杂度 是指该语句在算法中被重复执行的次数,不仅依赖于问题的规模n,也取决于待输入数据的性质。一般指最坏情况下的时间复杂度。
空间复杂度 定义为该算法所耗费的存储空间。 算法原地工作 是指算法所需辅助空间是常量,即O(1)。
2.1 线性表的定义和基本操作
线性表 是具有 相同数据类型 的n个 数据元素 的 有限 序列。除第一个元素外,每个元素有且仅有一个直接前驱;除最后一个元素外,每个元素有且仅有一个直接后继。
注意:线性表是一种逻辑结构,表示元素之间一对一的相邻关系。顺序表和链表是指存储结构 。两者属于不同层面的概念,因此不要混淆。
2.2 线性表的顺序表示
线性表的顺序存储又称为顺序表 。它是用一组地址连续的存储单元,依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。
顺序表的特点是表中元素的逻辑顺序与其物理顺序相同。
顺序表最主要的特点是 随机访问(随机存取),即通过首地址和元素序号可以在O(1) 的时间内找到指定的元素。但插入和删除操作需要移动大量元素 。
顺序表的存储密度高,每个结点只存储数据元素。
顺序表插入操作:
最好情况:在表尾插入,元素后移语句不执行,时间复杂度为 O(1)
最坏情况:在表头插入,元素后移语句将执行 n次,时间复杂度为O(n)
平均情况:平均时间复杂度为O(n)
顺序表删除操作:
最好情况:删除表尾元素,无需移动元素,时间复杂度为O(1)
最坏情况:删除表头元素,需要移动除第一个元素外的所有元素,时间复杂度为 O(n)
平均情况:平均时间复杂度为O(n)
顺序表按值查找(顺序查找):
最好情况:查找的元素就在表头,仅需比较一次,时间复杂度为O(1)
最坏情况:查找的元素在表尾或不存在时,需要比较 n 次,时间复杂度为 O(n)
平均情况:平均时间复杂度为 O(n)
2.3 线性表的链式表示
链式存储线性表时,不需要使用地址连续的存储单元,即它不要求逻辑上相邻的两个元素在物理位置上也相邻,对线性表的插入和删除不需要移动元素,只需要修改指针。
单链表是非随机存储的存储结构 ,即不能直接找到表中某个特定的结点。
头结点和头指针的区分 :不管带不带头结点,头指针始终指向链表的第一个结点,而头结点是带头结点链表中的第一个结点,结点内通常不存储信息。
采用头插法建立单链表 :从一个空表开始,生成新结点,并将读取到的数据存放在新结点的数据域中,然后将新结点插入到当前链表的表头,即头结点之后。
读入数据的顺序与生成的链表中元素的顺序是相反的。
每个结点插入的时间为O(1),设单链表长为n,则总的时间复杂度为O(n)。
采用尾插法建立单链表 :将新结点插入到当前链表的表尾上,为此必须增加一个尾指针r,使其始终指向当前链表的尾结点。
时间复杂度和头插法相同。
按序号查找结点值 :在单链表中从第一个结点出发,顺指针next域逐个往下搜索,直到找到第i个结点为止,否则返回最后一个结点指针域NULL。
时间复杂度为O(n)。
按值查找表结点 :从单链表第一个结点出发,由前往后依次比较表中各结点数据域的值,若某结点数据域的值等于给定值e,则返回该结点的指针,否则返回NULL。
时间复杂度为O(n)。
插入结点操作 :先检查插入位置的合法性,然后找到待插入位置的前驱结点,即第i-1个结点,再在其后插入新结点。
主要的时间开销在于查找第i-1个元素,时间复杂度为O(n)。若是在给定的结点后面插入新结点,则时间复杂度仅为O(1)。
删除结点操作 :先检查删除位置的合法性,然后找到待删除位置的前驱结点,即第i-1个结点,再将其删除。
时间复杂度为O(n)。
双链表 结点中有两个指针prior和next,分别指向其前驱结点和后继结点。双链表中执行按值查找和按位查找的操作和单链表相同,但双链表插入、删除操作的时间复杂度仅为O(1)。
循环单链表 和单链表的区别在于,表中最后一个结点的指针不是NULL,而改为指向头结点,从而整个链表形成一个环。故表中没有指针域为NULL的结点。
循环双链表 L中,某结点*p为尾结点时,p->next=L;当循环双链表为空表时,其头结点的prior域和next域都等于L。
静态链表是借助数组来描述线性表的链式存储结构 ,结点也有数据域data和指针域next,这里的指针是结点的相对地址(数组下标),又称为游标。
顺序表和链表的比较:
3.1 栈
栈:后进先出(LIFO),又称为后进先出的线性表
顺序栈 的实现:
栈顶指针 :S.top,初始时设置 S.top=-1 ; 栈顶元素 :S.data[S.top]。
进栈操作 :栈不满时, 栈顶指针先加 1 ,再送值到栈顶元素。S.data[++S.top]=x。
出栈操作 :栈非空时ÿ