算法和时间复杂度

来源:互联网 发布:win10中的keeper软件 编辑:程序博客网 时间:2024/06/06 08:09


算法

算法求解一个特定问题的有限指令序列.

算法操作的是数据结构有输入量(可选), 输出量.

算法特征

有穷性确定性可行性输入量(可选), 输出量(一定有)

算法设计要求

正确性可读性健壮性(稳定性), 高效低存储(占用内存容量,占用硬盘容量)

时间复杂度

问题求解规模 n

代码行执行总次数为语句频度f(n)

代码执行时间的增长率T(n)

T(n) = O(f(n))

 

时间复杂度计算举例

f(n) = 3(代码执行次数是固定的) = f(1)

T(n) = O(fn(n)) = O(3) = O(1) 常量阶(常量数量级)

 

算法复杂度性能排名(最优到最差)

O(1) 常量阶 最快, n = 无穷时也只执行一次就完成.

O(Log2n) 对数阶 很快 e.g. 2^3 = 8, Log2^n = 3, n = 8只需要执行3

O(n) 线性阶 性能很慢了, e.g. n = 1000, 要执行1000次才能完成.

O(n^2) 平方阶 非常慢 n = 1000 需要执行 1000 * 1000次才能完成

O(n^3) 立方阶 蜗牛一样慢 n = 1000 需要执行 1000*1000*1000次才能完成

O(2^n) 指数阶 不能接受的性能指标, n = 8需要执行 2^8 = 256次才能完成.

 

时间复杂度计算举例

f(n) = 1 + n + n = 1 = 2n + 2

T(n) = O(f(n)) = O(2n+2) = O(n); 线性阶只取最高阶忽略其他

 

f(m,n) = 1 + m + 2*m*n + m = 2mn + 2m + 1

假设m=n, 必须只保留一个变量

f(n) = 2n^2 + 2n + 1

T(n) = O(f(n)) = O(2n^2 + 2n + 1) = O(n2) 只取最高阶忽略其他忽略常量系数

 

时间复杂度计算简化规则

O(1) 没有循环

O(log2n) 一重循环但是执行次数小于循环次数n, e.g. 在有序序列中折半查找一个数据.

O(n) 一重循环

O(n^2) 两重循环

O(n^3) 三重循环

 

时间复杂度的最好最坏情况分析

算法的标称时间复杂度是按照算法执行次数的最坏情况给出的.

时间复杂度的最好情况可以作为算法使用场合的参考.

e.g. 对于有序序列的冒泡排序虽然是2个循环但是执行时却是O(n)

这样就派生出优化的冒泡排序算法.

 

空间复杂度

在设计算法时空间复杂度一般不考虑不重要优先考虑用空间换时间.

只有当空间复杂度大到不可接受的程度时才考虑降低空间复杂度的指标.

 

对数阶的案例

有序序列的折半查找.


0 0
原创粉丝点击