绪论
携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情
数据结构的基本概念
数据结构的三要素
-
数据的逻辑结构
数据的逻辑结构是以面向实际问题的角度出发的只采用抽象表达方式独立于存储结构。
-
数据的存储结构(物理结构)
- 顺序存储
- 把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中, 元素之间的关系由存储单元的邻接关系来体现。其优点是可以实现随机存取,每个元素占用最少的存储空间,缺点是只能使用相邻的一整块存储单元,因此可能产生较多的外部碎片。
- 链式存储 其优点是不会出现碎片现象,能充分利用所有存储单元;缺点是每个元素因存储指针而占用额外的存储空间,且只能实现顺序存取。
- 索引存储 在存储元素信息的同时,还建立附加的索引表。索引表中的每项称为索引项,索引项的一般形式是(关键字,地址)。其优点是检索速度快;缺点是附加的索引表额外 占用存储空间。另外,增加和删除数据时也要修改索引表,因而会花费较多的时间。
- 散列存储 根据元素的关键字直接计算出该元素的存储地址,又称哈希(Hash)存储。其优点是检索、增加和删除结点的操作都很快;缺点是若散列函数不好,则可能出现元 素存储单元的冲突,而解决冲突会增加时间和空间开销。
-
数据的运算
算法和算法评价
算法(Algorithm)是对特定问题求解步骤的一种描述,它是指令的有限序列,其中的每条指令表示一个或多个操作。此外,一个算法还具有下列5个重要特性:
- 有穷性。
- 确定性。
- 可行性。
- 输入。
- 输出。
- 正确性。
- 健壮性。
- 效率与低存储量需求。
算法效率的度量
最坏时间复杂度是指在最坏情况下,算法的时间复杂度。平均时间复杂度是指所有可能输入实例在等概率出现的情况下,算法的期望运行时间。 最好时间复杂度是指在最好情况下,算法的时间复杂度。 —般总是考虑在最坏情况下的时间复杂度,以保证算法的运行时间不会比它更长。 在分析一个程序的时间复杂性时,有以下两条规则:加法规则和乘法规则。
- 加法规则 T(n)= T1(n)+T2(n)=o(f(n))+o(g(n))=o(max(f(n),g(n)))
- 乘法规则 T(n)= T1(n)*T2(n)=o(f(n))*o(g(n))=o(f(n)*g(n))
- 常见的渐近时间复杂度为 常对幂指阶
应用题
设n是描述问题规模的非负整数,下列程序段的时间复杂度是(n^1/2)。
x=0;
while(n>=(x+1)*(x+1))
x=x+1;
思路
假设第k次循环终止,则第k次执行时,(x+1)^2>n,x的初始值为0,第k次判断时,x=k-1,即k^2>n,即k>n^1/2,因此该程序段的时间复杂度为O(n^1/2)。
总结归纳
如何计算时间复杂度
普通程序
1.找到所占空间大小与问题规模相关的变量 2.分析所占空间x与问题规模n的关系x=f(n) 3.x的数量级O(x)就是算法空间复杂度S(n)
递归程序
1.找到递归调用的深度X与问题规模n的关系x=f(n) 2.x的数量级O(x)就是算法空间复杂度S(n) 注:有的算法各层函数所需存储空间不同,分析方法略有区别 “常对幂指阶”