《数据结构(C语言版 第二版)》严蔚敏 李冬梅 吴伟民 编著
今天是学习数据结构的小白一枚,文章中如有错误或侵权,望指出!ෆ( ˶'ᵕ'˶)ෆ
目录
《数据结构(C语言版 第二版)》严蔚敏 李冬梅 吴伟民 编著
一.概念与术语
数据 | Data | 是客观事物的符号表示,是所有能输入计算机中并被计算机程序处理的符号的总称 |
数据元素 | Data Element | 是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理 |
数据项 | Data Item | 组成数据元素的、有独立含义的、不可分割的最小单位 |
数据对象 | Data Object | 是性质相同的数据元素的集合,是数据的一个子集 |
二.数据结构(Data Structure)
数据结构是相互之间存在一种或多种特定关系的数据元素的集合,包括逻辑结构&存储结构。
1.逻辑结构
数据的逻辑结构是从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。
两个要素:
- 数据元素
- 关系
基本逻辑结构 | 数据元素间的关系 | |
集合结构 | 属于同一个集合 | |
线性结构 | 一对一 | |
树结构 | 一对多 | |
图结构or网状结构 | 多对多 |
2.存储结构
数据对象在计算机中的存储表示称为数据的存储结构,也称为物理结构。
数据元素在计算机内用一个节点表示
顺序存储结构 | 各数据元素在物理上必须得连续的,通常用数组类型描述 |
链式存储结构 | 需要给每个节点附加指针字段,用于存放后继元素的存储地址 |
索引存储结构 | 在存储元素信息时还建立附加的索引表,索引表中每一项称为索引项,索引项的一般形式为(关键字,地址) |
散列存储结构 | 根据元素关键字直接计算出该元素的存储地址,又称哈希存储(Hash) |
- 链式、索引、散列等存储结构属于非顺序存储结构,各数据元素在物理上可以是离散的。
- 存储结构会影响存储空间分配的方便程度&数据运算的速度
运算的定义 | 针对逻辑结构,指出运算的功能 |
运算的实现 | 针对存储结构,指出运算的具体操作步骤 |
三.数据类型和抽象数据类型
1.数据类型:
是一个值的集合和定义在这个值集合上的一组操作的总称。eg. int类型、bool类型
2.抽象数据类型:
Abstract Data Type,ADT
一般指由用户定义的、表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称。
定义格式如下:
ADT抽象数据类型名{ 数据对象:<数据对象的定义> 数据关系:<数据关系的定义> 基本操作:<基本操作的定义> }ADT抽象数据类型名 |
- 数据对象和数据关系的定义采用数学符号和自然语言描述
- 基本操作的格式定义格式为:
基本操作名(参数表) 初始条件:<初始条件描述> 操作结果:<操作结果描述> |
四.算法Algorithm
- 英 [ˈælɡərɪðəm] 美 [ˈælɡərɪðəm]
算法的五个重要特性:
- 有穷性:一个算法必须在执行有穷步后结束,且每一步都必须在有穷时间内完成。算法必须是有穷的,而程序可以是无穷的。
- 确定性:对于每种情况下所应执行的操作,在算法中都有明确规定,不会产生二义性。
- 可行性:算法中的所有操作都可以通过已经实现的基本操作运算执行有限次来实现。
- 输入:一个算法有0个或多个输入。
- 输出:一个算法有1个或多个输出。无输出的算法没有任何意义。
评价算法优劣基本标准:
- 正确性
- 可读性
- 健壮性:当输入的数据非法时,好的算法能适当做出正确反应或进行相应处理,而不会产生一些莫名其妙的输出结果。
- 高效性:时间复杂度和空间复杂度是衡量算法的2个主要指标。
衡量算法效率的方法有2种:
- 事后统计法:缺陷很大!①必须将算法转换成可执行的程序②时空开销的测算结果依赖于计算机的软硬件等环境因素。
- 事前分析估算法
问题规模(用整数n表示) | 是算法求解问题输入量的多少,是问题大小的本质表示。 |
语句频度Frequency Count | 一条语句的重复执行次数 |
五.时间复杂度&空间复杂度
1.时间复杂度
用O来表示数量级
一般情况下,算法中基本语句重复执行的次数是问题规模n的某个函数,算法的时间量度记作:
T(n)=O(f(n))
它表示随着问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称时间复杂度(Time Complexity)
算法的时间复杂度
- 比大小:常对幂指阶
结论:
- 顺序执行的代码只会影响常数项,可以忽略。
- 只需挑循环中的一个基础操作分析它的执行次数与n的关系即可。
- 如果有多层嵌套循环,只需关注最深层循环循环几次。
三个重要概念:最好时间复杂度、最坏时间复杂度、平均时间复杂度
2.空间复杂度
采用渐近空间复杂度(Space Complexity)作为算法所需存储空间的量度,简称空间复杂度,它也是问题规模的函数,记作:
S(n) = O(f(n))
一般情况下,一个程序在机器上执行时,除了需要寄存本身所用的指令、常数、变量和输入数据外,还需要一些对数据进行操作的辅助存储空间。输入数据所占的具体存储量取决于问题本身,与算法无关,所以只需分析该算法在实现时所需的辅助存储空间。
△若算法执行时所需的辅助存储空间相对于输入量而言是一个常数,则称这个算法在原地工作。
六.习题
计算时间复杂度
1.
int func(int n){
int i=0,sum=0;
while(sum<n) sum+=++i;
return i;
}
解析:
2.
count=0;
for(k=1;k<=n;k*=2)
for(j=1;j<=n;j++)
count++;
解析:
3.
x=2;
while(x<n/2)
x=2*x;
解析:
4.设n是描述问题规模的非负整数,
x=0;
while(n>=(x+1)*(x+1))
x=x+1;
解析:
5.下面算法将一维数组a中的n个数逆序存放到原数组中
for(i=0;i<n/2;i++)
{
t=a[i];
a[i]=a[n-i-1];
a[n-i-1]=t;
}
解析:
6.下面算法将一维数组a中的n个数逆序存放到原数组中
for(i=0;i<n;i++)
b[i]=a[n-i-1];
for(i=0;i<n;i++)
a[i]=b[i];
解析:
7.设一维数组中有n个数据元素,则读取第i个数组元素的平均时间复杂度为:O(1)
解析:
8.
x=90; y=100;
while(y>0)
if(x>100)
{x=x-10;y--;}
else x++;
解析:
基本语句“y--”和“x++”,执行次数由x和y决定,而x、y是常数,所以T(n)= O(1)
9.
for(i=0;i<n;i++)
for(j=0;j<m;j++)
a[i][j]=0;
解析:
嵌套循环,由乘法规则可得T(n)=O(n*m)
10.
i=1;
while(i<=n)
i=i*3;
解析:
11.
x=n; //n>1
y=0;
while(x>=(y+1)*(y+1))
y++;
解析:
计算语句频度
1.以下程序段中语句“x++;”的语句频度为:
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
for(k=1;k<=j;k++)
x++;
解析:
2.以下程序段中语句“m++;”的语句频度为:
int m=0,i,j;
for(i=1;i<=n;i++)
for(j=1;j<=2*i;j++)
m++;
解析:
概念性问题
以下关于数据结构的说法中正确的是(A)。 数据结构三要素: 逻辑结构、存储结构、运算 对于D选项:栈和队列的逻辑结构和存储结构可以相同,但由于运算不同,而属于两种不同的数据结构。 |
算法是(D) A.计算机程序 |
抽象数据类型的三个组成部分分别为(A) A.数据对象、数据关系和基本操作 B.数据元素、逻辑结构和存储结构 C.数据项、数据元素和数据类型 |
抽象数据类型的描述错误的是(B)。 D.使用与实现分离 //其余三个是特点 |
通常从正确性、易读性、健壮性、高效性等4个方面评价算法的质量,以下解释错误的是(D) A.正确性算法应能正确地实现预订的功能 B.易读性算法应易于阅读和理解,以便调试、修改和扩充 C.健壮性指当环境发生变化时,算法能适当地做出反应或进行处理,不会产生不需要的运行结果 D.高效性即达到所需要的时间性能 |
设数据结构A=(D,R),其中D={1,2,3,4},R={r},r={<1,2>,<2,3>,<3,4>,<4,1>},则数据结构A是(C)。 A.线性结构 B.树结构 C.图 //<>表示连接 D.集合 |
在相同的规模n下,复杂度 O(n)的算法在时间上总是优于复杂度0(n²)的算法(√) 所谓时间复杂度是指最坏情况下,估算算法执行时间的一个上界(√) 某算法的时间复杂度为O(n²),表明该算法的执行时间与n²成正比(√) |
“加油~”