本人是看小甲鱼的数据结构来学习数据结构的。所以主要内容都是来自于小甲鱼。
- 数据结构分类
数据结构分为逻辑结构和物理结构。
逻辑结构分为:集合(无序)、线性(一对一)、树形(一对多)、图形(多对多)。
物理结构分为:顺序结构(逻辑关系、物理关系统一)、链式结构(不统一)、索引结构、散列结构。
索引结构:在存储结点信息时,建立一个附加的索引表,每一项是索引项,一般形式是:(关键字,地址),关键字是唯一标识一个结点信息的数据项。(就像Android里的那种界面传递数据的,key—value)。若每个结点都有各自的索引项,为稠密索引(索引项的地址指出结点地址)。若一组结点在索引表只对应一个索引项(稀疏索引),则索引项地址指向这些结点的起始地址。
散列结构(哈希结构):是根据结点的关键字计算出结点的物理地址,关键在于通过关键字作为自变量,建立一个函数关系。在得到的函数值作为存储地址,放置结点。 - 算法特征:
输入(n>=0)、输出(n>=1)、有穷性、确定性、可行性。
有穷性:重点在于时间上不能无限循环,必须在有限时间完成。
确定性:
每个步骤都有确定含义,不会出现二义性;
算法在一定条件下只有一条执行路径,相同的输入只有唯一输出;
算法的每个步骤都应该被精确定义而无歧义。
可行性:每一步都是可行的,即每一步都能通过执行有限次数完成。 - 算法设计的要求:
正确性:无语法错误、合法输入有合法输出;
健壮性:非法输入时,有健壮的处理;
可读性:方便人们进行阅读交流;
执行时间效率高:对于同一问题,尽量采用执行时间短的算法;
低存储容量:执行算法所需的辅助空间少。 - 算法分析
现在主要是用算法的执行时间作为主要衡量的标志。粗略认为,算法中某语句执行的次数(语句的执行频度),作为该条语句算法时间的量度。整理算法中的各条语句,最大的那条语句的执行次数,即为该段算法的最大执行次数。
如:
A: { x++; s+= x; } 执行次数为1
B: for(i = 1;i<=n;i++){ 执行次数为n+1(i++执行为n+1次)
x++; s+= x; 执行次数为n
}
用O(f(n))来表示。f(n)即执行最多次的那条代码的最高阶的,无系数的函数表达,如n、n^2 n^3之类,不考虑其他项了。即
T(n)称为算法的时间复杂度, T(n)= O(f(n))。
O(1)<O(log2n)<O(n)<O(n*log2n)<O(n2)<O(n3)<O(2^n)
注意,T(n)只是定性计算时间复杂度。定量计算的话,需要把所有语句的执行时间都加上,最后才知道的。