408 数据结构 知识点总结

我在准备21年408考研的过程中,根据王道考研书的内容、linjiafengyang的总结和其它相关资料,将数据结构的知识点总结如下。大家复制后可以根据自身需求增删知识点、打印成册以方便学习。其中一些公式和特殊符号可能无法正确显示,可以点击此处(csdn要积分)下载docx文件查看,也可以点这里下载(提取码:s2do)。

目录

  • 第1章 绪论
  • 第2章 线性表
  • 第3章 栈和队列
  • 第4章 串
  • 第5章 树与二叉树
  • 第6章 图
  • 第7章 查找
  • 第8章 排序

第1章 绪论

1.1 数据结构的基本概念

数据元 是数据的基本单位,一个 数据元素 可由若干个 数据项 完成, 数据项 是构成 数据元素 的不可分割的最小单位。例如,学生记录就是一个数据元素,它由学号、姓名、性别等数据项组成。

数据对象 是具有 相同性质的数据元素 的集合,是数据的一个子集。

数据类型 是一个值的集合和定义在此集合上一组操作的总称。

  • 原子类型:其值不可再分的数据类型
  • 结构类型:其值可以再分解为若干成分(分量)的数据类型
  • 抽象数据类型 :抽象数据组织和与之相关的操作

抽象数据类型(ADT )是指一个数学模型以及定义在该模型上的一组操作。抽象数据类型的定义仅取决于它的一组逻辑特性 ,而与其在计算机内部如何表示和实现无关。通常用( 数据对象、数据关系、基本操作集 )这样的三元组来表示。

#关键词:数据,数据元素,数据对象,数据类型,数据结构

数据结构的三要素:

  1. 逻辑结构 是指数据元素之间的逻辑关系,即从逻辑关系上描述数据,独立于计算机。分为线性结构和非线性结构,线性表、栈、队列属于线性结构,树、图、集合属于非线性结构。
  2. 存储结构 是指数据结构在计算机中的表示(又称映像),也称物理结构,包括数据元素的表示和关系的表示,依赖于计算机语言,分为顺序存储(随机存取)、链式存储(无碎片)、索引存储(检索速度快)、散列存储(检索、增加、删除快)。
  3. 数据的运算 :包括运算的定义和实现。运算的定义是针对逻辑结构的,指出运算的功能;运算的实现是针对存储结构的,指出运算的具体操作步骤。

1.2 算法和算法评价

算法是对特定问题求解步骤的一种描述,有五个特性: 有穷性、确定性、可行性、输入、输出 。一个算法有 零个或多个的输入 ,有 一个或多个的输出

时间复杂度 是指该语句在算法中被重复执行的次数,不仅依赖于问题的规模n,也取决于待输入数据的性质。一般指最坏情况下的时间复杂度。

空间复杂度 定义为该算法所耗费的存储空间。 算法原地工作 是指算法所需辅助空间是常量,即O(1)。

第2章 线性表

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,这里的指针是结点的相对地址(数组下标),又称为游标。

顺序表和链表的比较:

  1. 存取方式:顺序表可以顺序存取,也可以随机存取,链表只能从表头顺序存取元素。
  2. 逻辑结构与物理结构:采用顺序存储时,逻辑上相邻的元素,其对应的物理存储位置也相邻。而采用链式存储时,逻辑上相邻的元素,其物理存储位置则不一定相邻。
  3. 查找、插入和删除操作:对于按值查找,当顺序表在无序的情况下,两者的时间复杂度均为O(n);而当顺序表有序时,可采用折半查找,时间复杂度为O(logn)。对于按序号查找,顺序表支持随机访问,时间复杂度仅为O(1),而链表的平均时间复杂度为O(n)。链表插入、删除较优,只需修改相关结点的指针域即可。
  4. 空间分配:链式存储的结点空间只在需要的时候申请分配。
  5. 通常较稳定的线性表选择顺序存储,而频繁做插入、删除操作的线性表(即动态性较强)宜选择链式存储。

第3章 栈和队列

3.1

栈:后进先出(LIFO),又称为后进先出的线性表

顺序栈 的实现:
栈顶指针 :S.top,初始时设置 S.top=-1栈顶元素 :S.data[S.top]。
进栈操作 :栈不满时, 栈顶指针先加 1 ,再送值到栈顶元素。S.data[++S.top]=x
出栈操作 :栈非空时ÿ

你可能感兴趣的:(408,数据结构,考研)