第一章
1.数据结构的基本概念
1.1数据结构学什么?
如何将现实问题信息化?如何高效处理信息创造价值?
数据结构 = { D,R},D是某一数据对象;R是该集合中所有数据元素间的关系的有限集合。
====》数据结构包括:逻辑结构、存储结构和数据运算。
算法的设计取决于逻辑结构,算法的实现依赖于所采用的存储结构。
1.2基础概念
<1>数据 > 数据对象 > 数据元素 > 数据项
<2>数据结构:存在特定关系的数据元素的集合。
数据对象:具有相同性质的数据元素的集合。
如:海底捞排队系统中顾客之间的先后关系。
类似餐馆的排队系统与其顾客信息大致相同。
1.3数据结构三要素
逻辑结构、物理结构(存储结构)、数据的运算。
<1>逻辑结构(元素之间关系):
面向实际问题,只采用抽象表达,独立于存储结构。
线性结构:一对一
①一般线性表:线性表。
②受限线性表:栈、队列、串。
③线性表推广:数组、广义表。
非线性结构:(二维数组、多维数组等)
①集合:空
②树形结构(一般树、二叉树):一对多
③图状结构(网状结构)(有向图、无向图):多对多
<2>物理结构(存储结构):
逻辑结构在计算机上的映射,不能独立于逻辑结构而存在。
①顺序存储:逻辑相邻、物理也相邻。
②链式存储:逻辑相邻、物理不相邻。(结点内存储单元地址一定连续)
③索引存储:存储信息同时建立索引表。
④散列存储:(哈希存储)根据元素关键字计算存储地址。
PS:②、③、④属于非顺序存储。
①、②:内存。③、④外存。
<3>数据的运算:
施加在数据上的运算包括定义(指出运算功能,针对逻辑结构)和实现(运算的具体操作步骤,针对存储结构)。
PS:
确定一种存储结构,就意味着计算机中表示出数据的逻辑结构。存储结构不同,也会导致运算的具体实现不同。故只有确定存储结构才能实现数据结构
数据的逻辑结构(面向实际问题的角度出发的)独立于其存储结构【反之不然】。
存储数据时,不仅要存储元素的值,还要存储元素之间关系。
1.4数据类型和抽象数据类型
<1>数据类型:一个值的集合和在此集合上的一组操作 的总称。
①原子类型:其值不可再分。
②结构类型:其值可以再分。
<2>抽象数据类型:(Abstract Data Type,ADT):抽象数据组织及与相关的操作
用数学化的语言定义数据的逻辑结构和数据的运算,与实现(物理结构)无关通常用数据对象,数据关系,基本操作集三元组表示,构成一个完整的数据结构。
2.算法和算法评价
2.1算法的基本概念:
对特定问题求解步骤的一种准确而完整描述,是一系列解决问题的清晰指令,能够对一定规范的输入,在有限时间内获得所要求的输出。
<1>重要特性(5种):
①有穷性:有穷步骤,有穷时间。(程序可以是无穷的)
②确定性:相同输入,相同输出。
③可行性:用已实现的基本运算执行有限次实现。
④输入:0或多个输入。
⑤输出:1或多个输出。
<2>好算法特质(4种):
①正确性:能正确解决问题。
②可读性:能让人好理解。
③健壮性:对非法数据有效反应。
④效率与低存储需求:执行快(时间复杂度低),不费内存(空间复杂度低)。
<3>算法效率的度量:
通过时间复杂度和空间复杂度来描述的。
PS:
数据结构:如何把现实世界的问题信息化,将信息存进计算机。同时还要实现对数据结构的基本操作。
算法:如何处理这些信息,以解决实际问题。
2.2时间复杂度
一个语句的频度:该语句在算法中被重复执行的次数。
<1>问:如何估算时间的开销?
答:写好后运行,再计时(事后统计)。
存在的问题:
①与机器性能有关。
②与编程语言有关。
③与编译程序产生机器指令质量有关。
④无法事后估计(有不好影响)。
<2>事前预估法(渐近时间复杂度):
1>两条规则:
①加法规则:保留最高阶的项。
②乘法规则:都保留。
2>复杂度比较:常对幂指阶
O(1) < O( l o g 2 n log_2n log2n) < O(n) < O( n l o g 2 n nlog_2n nlog2n) < O( n 2 n^2 n2) < O( n 3 n^3 n3) < O( 2 n 2^n 2n) < O( n ! n! n!) < O( n n n^n nn)
3>只需考虑最深层循环次数与n的关系。
<3>问:若循环次数n不确定呢?
答:考虑:最好(一般不用)、最坏、平均复杂度。
平均时间复杂度:输入等概率出现的情况下,算法期望运行时间。
PS:
算法的性能问题只有在n很大时才会暴露出来。
while(i<=n){
i=i*2;//设最深层语句频度为x。故语句执行2^x次。
printf("Hello World %d\n",i);//即:2^x > n ===>x=log_2n+1(循环条件最后还要执行1次)
}
2.3空间复杂度
该算法所耗费的存储空间。
一个程序在执行时所消耗的存储空间:
(1)本身程序代码:大小固定,与问题规模无关。
(2)变量等:只需关注存储空间大小与问题规模有关的变量。
(3)函数递归调用(函数调用栈)。
算法原地工作:算法所需的辅助空间为常量,即O(1)。
题总结:
1.循环队列:本事是用数据表(存储),表示的队列(逻辑)。
总结:
数据结构主要是用来描述数据之间的关系及对数据的运算,三元素:逻辑结构、存储结构、数据的运算。
逻辑结构:描述逻辑上数据之间可能存在着什么样的关系,如:集合(同属集合,别无关系)、线性结构(一对一的关系)、树(一对多的关系)、图(多对多的关系)。
====》线性与非线性
存储结构:描述真正的元素之间的存储关系,顺序存储(元素连在一起)、链式存储(元素离散分布)、索引存储(索引表)、散列存储(关键字计算)。
====》顺序与非顺序
数据的运算:运算的定义(逻辑结构,指出功能)、运算的实现(存储结构,指出具体操作步骤)
而抽象数据类型,这是一种数据类型,即定义了一个数据结构:包含逻辑结构和运算的定义。但不包含具体的实现。
数据结构:要处理的信息。
算法:处理信息的步骤。
算法特性:1.有穷 2.确定 3. 可行 4.输入 5.输出
好算法特质: 1.正确 2.可读 3. 健壮 4.高效率,低存储