一.前言
数据结构:一门研究非数值计算的程序设计中计算机的操作对象以及它们之间的关系和操作的学科。
经典举例:1.学生信息系统(线性关系) 2.人机下棋对战(非线性关系)
二.基本概念和术语
数据:分为线性和非线性。
数据元素:数据的基本单位,是一个整体,比如学生信息的某一行,也称为记录、结点、顶点。
数据项:数据元素的基本单位,比如学生信息中包含的每一项就叫一个数据元素。
数据对象:性质相同的数据元素的集合,是数据的一个子集。
数据结构:相互之间存在一种或多种特定关系的数据元素的集合,包括三个方面:
逻辑结构:数据元素之间的逻辑关系:
物理(存储)结构:数据元素及其关系在内存中的表示(又称为映像)。
包括:顺序存储结构、链式存储结构、索引存储结构、散列存储结构
顺序存储结构:用一组连续的存储单元依次存储数据元素,数据元素之间的逻辑关系由元素的存储位置来表示;C语言中用数组来实现顺序存储结构。
链式存储结构:用一组任意的存储单元存储数据元素,数据元素之间的逻辑关系用指针来表示;C语言中用指针来实现链式存储结构。(指针就是地址,故链式存储的内容就是:元素本身+下一个元素的地址)
索引存储结构:存储数据结点信息的同时建立一个附加的索引表,如手机通讯录。
散列存储结构:根据结点的关键字直接计算出该结点的存储地址。
运算和实现:对数据元素可以施加的操作以及这些操作在相应的存储结构上的实现。
数据类型:一组性质相同的值的集合(范围)以及定义于这个值集合上的一组操作的总称。
抽象数据类型:
抽象数据类型定义的举例:
C语言实现抽象数据类型时,用已有的数据类型去描述它的存储结构;用函数描述它的操作;用类C语言作为描述工具(介于伪代码和C语言之间)。
三.算法与算法分析
算法:对特定问题求解方法的描述,是指令的有限序列,每条指令代表一个或多个操作。
算法的描述:1.用自然语言描述 2.流程图(传统/NS) 3.伪代码/类C语言 4.程序代码...
算法的特性:1.有穷性 2.确定性(没有二义) 3.可行性 4.有输入 5.有输出
算法设计的要求:1.正确性(通过精心选择的苛刻的几组数据) 2.可读性 3.健壮(鲁棒)性 4.高效性
算法分析:考虑算法的效率:1.时间效率 2.空间效率 这两个效率有时候是矛盾的!
1)分析时间效率:
可依靠程序执行时间来度量,分为事后统计/事前分析;
算法运行时间=E每条语句频度*该语句执行一次所需时间;
故我们把算法执行时间定义为该算法中每条语句的频度之和:
为了便于比较,我们可以直接比较算法执行频度之和的数量级,并将其称为渐进时间复杂度。
时间复杂度分为:最坏时间复杂度/平均时间复杂度/最好时间复杂度;
故在只需要比较时间复杂度的前提下,我们只需要求出数量级最大(其实就是执行次数最多,对算法的贡献最大)的那条语句,称其为算法的基本语句。
在找基本语句时,就是找循环中嵌套最深的语句。
经典例题:
对于复杂的算法,可以将它分成几个容易估算的部分:
a) 加法规则:T(n) = T1(n) + T2(n) = O(f(n)) + O(g(n)) = O(max(f(n),g(n))
b) 乘法规则:T(n) = T1(n) x T2(n) = O(f(n)) * O(g(n)) = O(f(n) * g(n))
2)分析空间效率:
同理知通过比较渐进空间复杂度,记作S(n):
设计好算法的过程总结:
其中算法分析就是通过计算算法的时间复杂度和空间复杂度来比较出最好(小)的算法。