数据结构-绪论
绪论
️概念,特性,设计要求
数据结构+算法=程序
数据类型
数据类型是一个值的集合和定义在此集合上的一组操作的总称,其分为:
- 原子类型:其值不可再分。
- 结构类型:其值可再分解为若干成分。
- 抽象数据类型:抽象数据组织以及相关操作。
易错题:
1.可以用( )定义一个完整的数据结构。 答案
A.数据元素 B.数据对象 C.数据关系 D.抽象数据类型
数据结构
数据结构包括三方面的内容:
- 逻辑结构:线性结构(线性表)、非线性结构(集合、树和图)
- 存储结构:
- 顺序存储:
- 定义:将逻辑上相邻的元素存储在物理位置相邻的存储单元中。
- 优点:实现随机存取、每个元素占用最少的存储空间。
- 缺点:只能使用相邻的一整块存储单元,可能产生较多外部碎片。
- 链式存储
- 定义:借助指示元素存储地址的指针来表示元素的逻辑关系。
- 优点:无碎片现象,能充分利用所有存储单元。
- 缺点:每个元素的存储指针额外占用存储空间,且只能顺序存取。
- 索引存储
- 定义:存储元素的同时,建立附加的索引表。
- 优点:检索速度快
- 缺点:索引表占用额外空间,增删数据修改索引表的时间开销大。
- 散列存储
- 定义:根据元素的关键字直接计算出该元素的存储地址,又称
哈希存储
。 - 优点:检索、增加和删除节点的操作很快
- 缺点:若散列函数不好,可能出现存储单元冲突,解决冲突会增加时间和空间的开销。
- 定义:根据元素的关键字直接计算出该元素的存储地址,又称
- 顺序存储:
- 数据的运算。
逻辑结构和存储结构关系密切,算法的设计取决于所决定的逻辑结构,而算法的实现依赖
于所采用的存储结构(逻辑 结构从逻辑关系上描述数据,从面向问题的实际角度出发,只采用抽象表达方式,因此可以说它独立于存储结构
)
易错题:
2 .以下属于逻辑结构的是( ) 答案
A.顺序表 B.哈希表 C.有序表 D.栈
3 .以下与数据的存储结构无关的术语是( ) 答案
A.循环队列 B.链表 C.哈希表 D.栈
算法概念
特性
- 有穷性 在有限步骤后结束
- 确定性 每一步必须确切定义,不能产生二义性
- 可行性 可行的
- 输入 有零个或多个输入
- 输出 一个或多个输出
设计要求
- 正确性 满足具体问题需求
- 可读性 好读,利于理解
- 健壮性 有容错处理,能对非法数据作出反应
- 效率与储存量需求 与问题规模有关
算法度量与分析
算法效率的度量是通过时间复杂度和空间复杂度来描述的。
时间复杂度T(n)
一般指的是最坏情况下时间复杂度,以保证算法的运行时间不会比他更长。
频度是指该语句被重复执行的次数,所有的频度之后记为T(n),算法的时间复杂度记为:T(n) = O(f(n))
,其中n为问题规模。
#define MAX 20
void matrixAdd(int n, int A[MAX][MAX], int B[MAX][MAX], int C[MAX][MAX]) {
int i,j,k;
for(i=0; i<n; i++){ //频度(基本运算):n
for (j=0; j < n; j++){ //频度:n^2
C[i][j] = A[i][j] + B[i][j]; //频度:n^2
}
}
}
例子中所有语句的频度之和为:
T(n)= n + n^2 + n^2 = 2n^2 + n
- 渐进式时间复杂度:只求出T(n)的最高阶,忽略其低阶项和常系数,可以简化T(n)的计算,客观反映当n很大时算法的时间性能
如果没有循环结构,则时间复杂度为O(1),如下:
简化的算法时间复杂度分析
- 如果有循环结构,则分析最深层循环中的语句的循环次数.
- 如果循环次数不明显,采用设未知数x来求时间复杂度:
最好,最坏时间复杂度分析;
平均时间复杂度分析:
- n个数据排序共有n!种输入情况,则在等概率情况(每种情况的概率为1/n!)下的平均时间复杂度为:
- 其中_pi表示查找第i个元素的概率,fi_表示查找第i个元素的比较次数
答案
1
D .抽象数据类型:描述了数据的逻辑结构和抽象运算,通常用(数据对象、数据关系、基本操作集)这样的三元组来表示,从而构成一个完整的数据结构定义。
2
C.有序表 是指关键字有序的线性表,仅描述元素间的逻辑关系,既可以链式存储又可以顺序存储,故属于逻辑结构。A、B、C既描述逻辑结构又描述存储结构和数据运算。
3
D.栈:是一种抽象数据类型,可采用顺序存储或链式存储,只表示逻辑结构。循环队列
是用顺序表表示的队列,是一种数据结构。