第一章 绪论
一、数据结构是什么,算法是什么?
至今为止,对于数据结构的定义,还没有统一的标准。但我们可以先简单的理解为:数据+结构
算法是为了解决某类问题而规定的一个有限长的操作序列
二、为什么要学数据结构?
早期的计算机主要用于数值计算。如今,计算机处理的数据已经不局限于数值,还包括字符、表格、图像等具有一定结构的数据。而高效的处理、组织这些数据成为了一个很重要的问题。“数据结构”就是来研究解决这些问题的
三、数据结构的基本概念与术语
1、数据、数据元素、数据项、数据对象
- 数据: 客观事物的符号表示,是所有计算机程序处理的符号的总称。
- 数据元素: 数据的基本单位。
- 数据项: 组成数据元素的、有独立含义的、不可分割的最小单位。
- 数据对象: 性质相同的数据元素的集合,是数据的一个子集。
2、数据结构
- 逻辑结构:从逻辑关系上描述数据,是从具体问题抽象处理的数学模型,与数据在计算机中的存储无关。
- 集合结构:数据元素之间除了属于同一集合,没有其他关系。
- 线性结构:数据元素之间存在一对一的关系。
- 树结构:数据元素之间存在一对多的关系。
- 图结构/网状结构:数据元素之间存在多对多的关系。
- 存储结构(物理结构):数据在计算机中的存储结构
- 顺序存储结构:逻辑上相邻,物理上也相邻。
- 链式存储结构:逻辑上相邻,物理上不相邻。
3、数据类型与抽象数据类型
-
数据类型: 一个值的集合和定义在这个值集上的一组操作的总称。
例如:C语言中的整型变量,其值集为某个区间的整数,定义在其上的操作为加减乘除
-
抽象数据类型: 指有用户定义的、表示应用问题的数学模型,已经定义在这个模型上的一组操作的总称
4、数据结构学习的内容
四、算法与算法分析
由于算法联系着数据在计算过程中的组织方式,在描述实现某种操作,常常需要设计算法。
1、算法的特性:
- 有穷性: 一个算法必须总是在执行又穷步后结束,且每一步必须在又穷时间内完成。
- 确定性: 每次执行的操作在算法中必须有确切的规定,不会产生歧义性。
- 可行性: 所有操作都可执行,且在有限次数执行完成。
- 输入输出: 对函数的形参进行输入,执行操作完成后有输出,没有输出的算法是无意义的。
2、算法优劣的评价标准
- 正确性
- 可读性
- 健壮性
- 高效性
3、算法的时间复杂度
当数据量十分庞大时,需要考虑程序的执行时间,完成同一操作,执行时间越短越好。
时间复杂度的计算
计算算法的时间复杂度,需要计算每一步操作的执行次数,取执行次数最多的操作为该算法的时间复杂度
//常数阶
for(i=0;i<10000;i++){
x++;
}
/*
虽然循环10000次,但算法执行时间是一个固定值,与问题规模n无关,因此该算法的时间复杂度为O(1)。
*/
//线性阶
for(i=0;i<n;i++){
x++;
}
/*
该算法执行n次,算法的执行时间与问题规模n呈线性关系,时间复杂度O(n).
*/
//平方阶
for(i=0;i<n;i++){
for(j=0;j<n;j++){
x++;
}
}
/*
该算法内层操作执行次数最多,执行了n^2次,算法的执行时间与问题规模n呈平方关系,时间复杂度O(n²)。
*/
//对数阶
i=1;
while(i<n){
i=i*2;
}
/*
假设循环执行了x次,那么2的x次等于n,x为log n,时间复杂度O(logn)。
*/