本文是笔者复习数据结构与算法的系列开篇,主要是一些重要的概念和理论,方便复习。
主要参考有:《数据结构与算法》、《大话数据结构》、《数据结构与算法之美》等。

-
绪论、算法、线性表(数组和链表)
-
基本概念和术语
- 数据: 描述客观事实的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。
- 数据元素:是组成数据、有一定意义的基本单位,在计算机中通常作为整体处理。也被称为记录。
- 数据项:一个数据元素可以由若干个数据组成。数据项是数据不可分割的最小单位。
- 数据对象:是性质相同的数据元素的集合,是数据的子集。
- 数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。
- 逻辑结构:是指数据对象中数据元素之间的相互关系。
- 集合结构:集合机构中的数据元素除了同属于一个集合外,它们之间没有其他关系。
- 线性结构:线性结构中的数据元素之间是一对一的关系。
- 树形结构:树形结构中数据元素之间存在一种一对多的层次关系。
- 图形结构:图形结构的数据元素是多对多的关系。
- 物理结构:是指数据的逻辑结构在计算机中的存储形式
- 顺序存储结构:是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系一致。
- 链式存储结构:是把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。
- 逻辑结构:是指数据对象中数据元素之间的相互关系。
- 数据类型:是指一组性质相同的值的集合及定义在此集合上的一些操作的总称。
- 原子类型:是不可以再分割的基本类型,包括整型/实型/字符型等。
- 结构类型:由若干个类型组合而成,是可以再分解的。例如,整型数组是由若干个整型数据组成的。
- 抽象数据类型:是指一个数学模型及定义在该模型上的一组操作。“抽象”的意义在于数据类型的数学抽象特性。
-
算法
- 定义:算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有序序列,并且每条指令表示一个或多个操作。
- 四大特性
- 输入输出:算法具有零个或多个输入,且至少有一个或多个输出。
- 有穷性:指算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可接受的时间内完成。
- 确定性:算法的每一步骤都具有确定的含义,不会出现二义性。
- 可行性:算法的每一步都必须是可行的,也就是说,每一步都能够通过执行有限次数完成。
- 设计要求
- 正确定:算法至少应该具有输入、输出和加工处理无歧义性、能正确反映问题的要求,能够得到问题的正确答案。
- 可读性:便于阅读、理解和交流。
- 健壮性:不合法输入不产生异常或莫名其妙的结果。
- 高效率和低存储:时间效率高和存储量低。
- 度量方法
- 事后统计方法():通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低。
- 事前分析估算方法:在计算机程序编制前,依照统计方法对算法进行估算。。
- 时间复杂度 T(n)=O(f(n))
- O(1)<O(logn)<O(n)<O(nlogn)<O(n²)<O(n³)<O(2^n)<O(n!)<O(n^n)
- 最好、最坏时间复杂度
- 平均情况时间复杂度
- 均摊时间复杂度:将耗时多的那次操作均摊到接下来的n-1次耗时少的操作上。
- 算法空间件复杂度 S(n)=O(f(n))
-
线性表
- 定义:零个或多个数据元素的有限序列。
- 存储结构
- 顺序存储结构:用一段地址连续的存储单元依次存储线性表的数据元素,若数据元素是相同类型,则为数组。
- 优点:无须为表示元素逻辑关系增加额外存储控件;可以借助CPU的缓存机制,预读数组中的数据,所以访问效率更高。
- 缺点:插入和删除需移动大量元素;大小固定,一经声明就要占用整块连续内存空间。扩容操作耗时。
- 链式存储结构:用一组任意的存储单元存放线性表的元素,每个元素除存放自身数据外,还存放指针域(链表)。
- 单链表:每个节点中是包含一个指针域。
- 优点:插入和删除操作简单,复杂度仅为O(1);无需提前分配存储控件。
- 缺点:查找复杂;需额外空间存放指针域。
- 静态链表:用数组描述的链表。
- 优点:插入和删除操作只需要修改游标,改善顺序存储结构中的需要移动大量元素的缺点。
- 未解决存储分配问题(表长);失去了顺序存储结构任意存储元素的优点。
- 循环链表:将单链表的尾指针指向头结点,首尾相接。
- 双向链表:单链表的每个节点中,多设置一个指向其前驱节点的指针域。
- 单链表:每个节点中是包含一个指针域。
- 顺序存储结构:用一段地址连续的存储单元依次存储线性表的数据元素,若数据元素是相同类型,则为数组。
-
From:SimonYe