绪论
什么是数据结构
数据是描述客观事物的数值、字符以及所有能输入计算机中并被计算机程序处理的符号的集合。
数据元素是数据的基本单位
数据对象是性质相同的有限个数据元素的集合,它是数据的一个子集(例如,A班中的每个学生记录都是一个数据元素)。在默认情况下,数据结构中的数据指的都是数据对象。
数据项是具有独立含义的数据最小单位,也成为成员或域(例如,A班中每个数据元素即学生记录是由学号、姓名、性别和班号等数据项组成)
数据结构是指所涉及的数据元素的集合以及数据元素之间的关系,由数据元素之间的关系构成结构,因此可以把数据结构看成带结构的数据元素之间的集合。
数据结构
=
数据对象
+
结构
数据结构 = 数据对象 + 结构
数据结构=数据对象+结构
- 数据逻辑结构:由数据元素之间的逻辑关系构成,是数据结构在用户面前呈现的形式。
- 数据存储结构:指数据元素及其关系在计算机存储器中的存储方式,也称为数据的物理结构。
- 数据运算:指施加在数据上的操作。
数据的逻辑结构(面向用户)
逻辑结构的表示
数据的逻辑结构是面向用户的,它反映数据元素之间的逻辑关系而不是物理关系,是独立于计算机的。
可以采用表格、图等用户容易理解的形式表示。
为了更通用地表述数据的逻辑结构,通常采用二元组表示数据的逻辑结构,一个二元组如下
B
=
(
D
,
R
)
B = (D, R)
B=(D,R)
B是一种逻辑数据结构,D是数据元素的集合,在D上数据元素之间可能存在多种关系,R是所有关系的集合。即:
D={di | 0≤i≤n-1,n≥0}
R={rj | 1≤j≤m,m≥0}
- R中的某个关系rj(1≤j≤m)是序偶的集合。
- 对于rj中的任一序偶<x,y>(x,y∈D),把x叫做序偶的第一元素,把y叫做序偶的第二元素,又称序偶的第一元素为第二元素的前驱元素,称第二元素为第一元素的后继元素。如在<x,y>的序偶中,x为y的前驱元素,而y为x的后继元素。
- 若某个元素没有前驱元素,则称该元素为开始元素;若某个元素没有后继元素,则称该元素为终端元素。
- 对于对称序偶,即满足这样的条件:若<x,y>∈r(r∈R),则<y,x>∈r(x,y∈D),可用圆括号代替尖括号,即(x,y)∈r。
逻辑结构的类型
集合:结构中数据元素之间除了“同属于一个集合”的关系外,没有其他关系,与数学中的集合概念相同。
线性结构:若结构是非空的,则有且只有一个开始元素和终端元素,并且所有元素最多只有一个前驱元素和一个后继元素。
树形结构:若结构是非空的,则有且仅有一个元素为开始元素(也成为根结点),可以有多个终端元素,每个元素有零个或多个后继元素,除开始元素外每个元素有且仅有一个前驱元素。
图形结构:若结构是非空的,则每个元素可以有多个前驱元素和多个后继元素。
数据的存储结构(面向程序员)
存储实现的基本目标:①数据元素的存储 ②数据元素之间关系的存储
逻辑结构是存储结构的本质,设计数据的存储结构称为从逻辑结构到存储器的映射。
顺序存储结构
1.所有元素存放在一片地址连续的存储单元中。
2.逻辑上相邻的元素在物理位置上也是相邻的,所以不需要额外空间表示元素之间的逻辑关系。
链式存储结构
1.把数据元素存放在任意的存储单元中,这组存储单元可以是连续的,也可以是不连续的。
2.通过指针域来反映数据元素的逻辑关系。
4种常用的存储结构类型:1.顺序存储结构 2.链式存储结构 3.索引存储结构 4.哈希(散列)存储结构
算法及其描述
算法是对特定问题求解步骤的一种描述,它是指令的有限序列。
五个重要特性
有穷性:指算法在执行有限的步骤之后自动结束而不会出现无限循环,并且每一个步骤在可接受的时间内完成。
确定性:对于每种情况下执行的操作,在算法中都有确定的含义,不会出现二义性。并且在任何条件下,算法都只有一条执行路径。
可行性:算法的每条指令都是可执行的,即便人借助纸和笔都可以完成。
输入性:算法有零个或多个输入。大多数算法中输入参数是必要的,但对于较简单的算法,如计算1+2的值,不需要任何输入参数,因此算法的输入可以是零个。
输出性:算法至少有一个或多个输出。算法用于某种数据处理,如果没有输出,这样的算法是没有意义的,算法的输出是和输入有着某些特定关系的量。
算法的描述方法:
程序流程图、 自然语言、 程序设计语言、 伪代码(算法语言)
算法分析——时间复杂度,T(n)
算法的设计目标:
正确性、可使用性、可读性、健壮性、高时间性能与低存储量需求
CPU时间 -> 时间性能分析
内存空间 -> 空间性能分析
算法分析目的:分析算法的时空效率以便改进算法性能
方法:事后统计法、 事前分析估算法
时间复杂度
一个算法是由控制结构(顺序、分支、循环三种)和原操作(指固有数据类型的操作,如+、-、*、/ 、++、–等)构成的。算法执行时间取决于两者的综合效果。
O(n)
如果代码循环、减半,一定会出现对数情况O(logn)或O(log2n)
小结
- 时间复杂度是用来估计算法运行时间的一个式子(单位)。
- 一般来说,时间复杂度高的算法比复杂度低的算法慢。
- 常见的时间复杂度(按效率排序)
- O(1)<O(logn)<O(√n)<O(n)<O(nlogn)<O(n2)<O(n2logn)<O(n3)<O(2n)<O(n!)
如何简单快速的判断一个时间复杂度
确定问题规模n
循环减半过程——>logn
k层关于n的循环——>nk