一、什么是数据结构
- 数据对象在计算机中的组织方式
(1)逻辑结构
(2)物理存储结构
数据对象必定与一系列加在其上的操作相关联,完成这些操作所用的方法就是算法 - 抽象数据类型(Abstract Data Type)
(1)数据类型:
数据对象集
数据集合相关联的操作集
(2)抽象:
描述数据类型的方法不依赖于具体实现与存放数据的机器,数据存储的物理结构,实现操作的算法和编程语言无关。
只描述数据对象集和相关操作集“是什么”,并不涉及“如何做到”的问题
二、 什么是算法(Algorithm)
- 一个有限的指令集
(1)接受一些输入(0—N个输入)有些时候不需要输入
(2)产生输出
(3)一定在有限步骤之后终止
(4)每一条指令必须:
– 有充分明确的目标,不可有歧义
– 计算机能处理的范围之内
– 描述不依赖于任何一种语言及具体实现的手段 - 空间复杂度S(n)
根据算法写成的程序在执行时占用存储单元的长度。这个长度与输入数据的规模有关,空间复杂度过高的算法可能导致使用的内存超限,造成程序非正常中断。 - 时间复杂度T(n)
根据算法写成的程序在执行时耗费时间的长度。往往与输入数据的规模有关系
时间复杂度主要针对乘除次数,忽略加减法 - 在分析一般算法的效率时,经常关注两种复杂度
最坏情况的复杂度Tworst(n)
平均复杂度 Tavg(n)
Tavg(n) <= Tworst(n)
avg不易计算,常考虑最坏复杂度 - 复杂度的渐进表示法
① T(n) = O[f(n)] 表示存在常数C>0,n0>0,使的当n>n0时,有T(n)<=C * f(n) 上界
② T(n) = Ω[g(n)] 表示存在常数C>0,n0>0,使得当n>n0时,有T(n)>=C * g(n) 下界
③ T(n) = θ[h(n)] 表示同时有T(n)=O[h(n)] 和T(n) =Ω[h(n)] 既是上界也是下界 - ① 若两段算法分别是T1(n)=O[f1(n)] 和T2(n)=O[f2(n)] 则:
T1(n)+T2(n) = Max ( O[f1(n)] , O[f2(n)] )
② 若T(n)是关于n的k阶多项式,则T(n) = O(nk)
③ for循环的时间复杂度=循环次数*循环体代码的复杂度
④ if-else结构的复杂度取决于if条件判断的复杂度和两个分支的复杂度,总体复杂度取三者中最大。 - O(1) < O(logn) < n < O(nlogn) <n2 <n3 < 2n <n!