绪论
一. 数据结构在学什么
1. 高效地用程序代码信息化现实问题
二. 数据结构的基本概念
1. 数据元素——描述一个个体
数据元素是数据的基本单位,通常作为一个整体考虑和处理。
数据元素可由若干个数据项组成,数据项是构成数据元素的不可分割的最小单位。
2. 什么是数据对象
数据对象是具有相同性质的数据元素的集合,是数据的一个子集。
数据结构是相互之间存在一种或多种特定关系的数据元素的集合。
三. 数据结构的三要素
1. 逻辑结构
集合结构(各个元素属于同一集合)
线性结构(一对一,除第一个元素都有唯一前驱,除最后一个元素都有唯一后继,如:排行榜、餐厅排号)
树形结构(一对多,如:思维导图、文件夹和文件)
网状结构/图结构(多对多,如:道路信息、好友信息)
2. 数据的运算
针对某种逻辑结构,定义基本运算(如:线性结构——①查找第i个数据元素②在第i个位置插入③删除)
3. 物理结构(存储结构)
常见:顺序存储、链式存储、索引存储、散列存储
以线性结构为例:
顺序存储,把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现。
链式存储
索引存储
散列存储/哈希(Hash)存储
存储结构会影响存储空间分配的方便程度和数据运算速度(如:插入新元素)
4. 数据类型、抽象数据类型
数据类型
1)原子类型,值不可再分(int、boolean)
2)结构类型,值可分解(struct)
抽像数据类型(Abstract Data Type,ADT)
第一章 算法
一. 算法的基本概念
1. 什么是算法
程序 = 数据结构 + 算法
数据结构是要处理的信息,算法是处理信息的步骤
2. 算法的特性
有穷性、确定性(相同输入得到相同输出)、可行性(可代码实现)、输入,输出
好的算法:正确性、可读性、健壮性(处理非法数据、报错等)、高效率与低存储需求(时间复杂度和空间复杂度低)
二. 算法的时间复杂度
1. 时间复杂度T(n)
事先预估算法时间开销T(n)和问题规模n的关系
Q1:是否可以忽略表达式的某些部分?
A1:低阶部分和常数。
数量级:“常对幂指阶”
Q2:每一行代码都要计算吗?
A2:只关注循环体,若有循环嵌套,只关注最深层循环。
计算算法时间复杂度时,通常只关注最坏时间复杂度、平均时间复杂度
小练习
1.
while(i<=n){
i=i*2;
}
当时,循环结束,
2.
int flag[n]={1,2,3,...,n};
for(int i = 0;i<flag.size();i++){
if(flag[i]==n){
break;
}
}
最好时间复杂度T(n)=O(1);
最坏:T(n)=O(n);
平均:每个位置出现概率为,,T(n)=O(n).
三. 算法的空间复杂度
1. S(n) 空间复杂度(以及算法原地工作的概念)
算法原地工作:无论问题规模怎么改变,算法所需内存空间为常量S(n)=O(1)。
与时间复杂度类似:只关注与问题相关的数量级(“常对幂指阶”)
1.
int flag[n][n];
int other[n];
int i;
2.函数递归带来的内存开销
void function(int n){
int a,b,c;
if(n>1){
function(n-1);
}
printf("break%d\n",n);
}