目录
什么是数据结构?
-
从广义上讲,数据结构描述现实世界实体的数学模型及其上的操作在计算机中的表示和实现。
-
数据结构是研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作等的学科。
基本概念和术语
1. 数据(Data)
数据是信息的载体,是描述客观事物的数、字符、以及所有能输入到计算机中,被计算机程序识别和处理的符号的集合;分为数值性数据和非数值性数据(多媒体信息处理)。
2. 数据元素(Data Element)
-
数据元素是数据的基本单位,又称为元素、结点、记录;有时一个数据元素可以由若干数据项(Data Item)组成。
-
数据项是具有独立含义的最小标识单位,也称域。
-
三者之间的关系:数据 > 数据元素 > 数据项
3. 数据对象 (data object)
数据对象是具有相同性质的数据元素的集合,是数据的一个子集。
4. 数据结构(Data Structure)
-
数据结构是存在一种或多种特定的关系数据元素的集合。记为:Data_Structure = {D, S} 其中,D 是某一数据对象, S 是该对象中所有数据成员之间的关系的有限集合。
-
四个基本结构:集合;线性结构;树形结构;网状结构
-
数据结构包括“逻辑结构” 和“物理结构”两个方面(层次):
-
数据的逻辑结构(唯一)
-
从逻辑关系上描述数据,与数据的存储无关;是从具体问题抽象出来的数据模型;与数据元素本身的形式、内容无关;
-
数据的逻辑结构分类
-
划分方法一
-
线性结构:有且仅有一个开始和一个终端结点,并且所有结点都最多只有一个直接前趋和一个后继;eg:线性表
-
非线性结构:一个结点可能有多个直接前趋和直接后继;eg:树;图(或网络)
-
-
划分方法二
-
集合:数据元素间除“同属于一个集合”外,无其它关系
-
线性结构:一个对一个,如线性表、栈、队列
-
树形结构:一个对多个,如树
-
图形结构:多个对多个,如图
-
-
-
-
数据的存储结构 / 物理结构(不唯一)
-
是逻辑结构在计算机中的映象,依赖于计算机语言
-
数据运算(插入、删除、修改、查找、排序)的实现依赖于存储关系
-
存储结构的分类
-
顺序存储结构——借助元素在存储器中的相对位置表示数据元素间的逻辑关系
-
优点1:存储密度大,空间利用度高,比链式存储节约空间
-
优点2:存储操作上方便操作,顺序支持随机存取,查找会比较容易
-
缺点1:插入或者删除元素时不方便,花费的时间更多
-
-
链式存储结构——借助指示元素存储地址的指针表示数据元素间的逻辑关系
-
优点1:插入或删除时方便些,空间使用灵活
-
缺点1:存储密度小,空间利用度低
-
缺点2:查找会相较顺序存储方式复杂一些,花费的时间会更多
-
-
-
-
5. 抽象数据类型
-
抽象数据类型是指一个数学模型以及定义在此数学模型上的一组操作。
-
数据结构+定义在此数据结构上的一组操作 = 抽象数据类型
算法和算法分析
1. 算法分析特性:
-
有穷性 算法在执行有穷步后能结束
-
确定性 每步定义都是确切、无歧义
-
可行性 每一条运算应足够基本
-
输入 有0个或多个输入
-
输出 有一个或多个输出
2. 算法设计的原则
-
正确性:程序对于精心选择的、典型、苛刻且带有刁难性的几组输入数据能够得出满足要求的结果 [标准]
-
可读性
-
健壮性
-
当输入的数据非法时,算法应当恰当地作出反映或进行相应处理,而不是产生莫名奇妙的输出结果。
-
处理出错的方法不应是中断程序的执行,而应是返回一个表示错误或错误性质的值,以便在更高的抽象层次上进行处理。
-
-
高效率与低存储量需求
3. 和算法执行时间相关的因素
-
算法选用的策略
-
问题的规模
-
编写程序的语言
-
编译程序产生的机器代码的质量
-
计算机执行指令的速度
4. 算法的复杂度
-
(渐近)时间复杂度:T (n) = O(f(n))
-
随着问题规模 n 的增长,算法执行时间的增长率和 f(n) 的增长率相同
-
时间复杂度的计算
-
算法中基本语句(语句频度最大)重复执行的次数
-
常数阶O(1):无论代码执行了多少行,参数有多大,只要执行次数没有随着输入参数的变化而变化,那它的时间复杂度就是 O(1)
-
对数阶O(log2n):在while循环中,每循环一次i都会乘于2,当乘到x次时,i>n则退出循环,,所以while内的代码会执行x次,即i^x>n,又因为i每次的乘数是2即底数为2,所以它的时间复杂度是 (log2n), 如果乘数是3则是O(log3n)
-
线性阶O(n):在for循环中,j=i会被执行n次,所以它的时间复杂度为O(n)
-
线性对数阶O(nlog2n):将对数阶的代码再循环执行n遍,如果i的乘数为2,则时间复杂度为O(nlog2n)
-
平方阶O(n2):平方阶则是将线性阶再循环执行n遍,记总共执行了n*n=n2,所以它的时间复杂度为O(n2)
-
-
-
空间复杂度: S(n) = O(g(n))
-
随着问题规模 n 的增大,算法运行所需存储量的增长率与 g(n) 的增长率相同。
-
算法的存储量包括:输入数据所占空间;程序本身所占空间;辅助变量所占空间。
-