数据结构分类
(1)按照逻辑结构的方式分为四种:集合结构、线性结构、树形结构、图形结构。
(2)按照物理结构的方式分为两种:顺序存储结构、链式存储结构算法的特性(5个):
(1)输入、输出:可以没有输入,但是最少有一个输出。
(2)有穷性:算法一定可以自动结束
(3)确定性:在一定条件下,只有一条执行路径,不会产生二义问题。
(4)可行性:每一步都能通过执行有限次完成,可以转换成程序运行,并得到正确的结果。算法设计的要求(5个)
(1)正确性:算法没有语法错误、对于合法数据能够产生满足要求的输出结果、对于非法数据能够得出满足规格的说明结果,这是一般做算法的要求。
(2)可读性:他人也可以看懂
(3)健壮性:当输入数据不合法的时候,可以做出相关处理,而不是产生异常或者其他不正常的结果。
(4)时间效率高和存储量低:简单来说,就是花最少的时间、用最少的存储空间办成同样的事就是好算法。算法效率的度量方法
(1)事后统计方法:不实用,不再描述。
(2)事前分析估算法(就是一直提到的时间复杂度):一个程序的运行时间依赖于两个方面:算法好坏和问题的输入规模(输入量多少)。测定运行时间最可靠的方法,就是计算对运行时间有消耗的基本操作的执行次数。时间复杂度(O())
分析算法复杂度,最重要的就是分析循环结构的运行情况,数列的相关运算是要补充的知识。
推导算法:
(1)用常数1取代运行时间中的所有加法常数。
(2)在修改后的运行次数函数中,只保留最高项。
(3)如果最高项存在且不是1,则去除与这个项相乘的常数。
得到的结果就是O()- 常见的时间复杂度
执行次数函数 | 阶 | 非正式术语 |
---|---|---|
12 | O(1) | 常数阶 |
2n+3 | O(n) | 线性阶 |
3n2+2n+1 | O(n2) | 平方阶 |
5log2n+20 | O(logn) | 对数阶 |
2n+ nlog2n+19 | O(nlogn) | nlogn阶 |
6n3+2n2+4 | O(n3) | 立方阶 |
2n | O(2n) | 指数阶 |
常用的时间复杂度所耗费的时间从小到大依次是:
O(1)< O(logn) < O(n)< O(nlogn)< O(n2) < O(n3) < O(2n) < O(n!)< O(nn)