算法分析, 时间复杂度,和BIG O,OMEGA, THETA NOTATION

实验方法

  1. 用Java的StopWatch数据类型,记录从创建对象到算法完成所需的时间
  2. 程序在不同的计算机上运行时间之比通常是一个常数。我们可以用幂次法则,绘制标准图像和对数图像。标准图像X轴为问题规模(N),y轴为运行时间T(N)。而对数图像中,x轴就是lg(N),y轴是lg(T(N))。对数图像会是一条直线,等价于我们对数据符合公式T(N)=aN^b的猜想。
  3. 数学模型:一个程序运行的总时间主要和两点有关:1是每行语句执行的耗时,2是每条语句的频率。算出方程表达式之后取最高次数项。

More about 数学模型在算法分析中的应用

对于大多数程序,得到算法的运行的数学模型有如下步骤

  1. 确定input size,输入模型
  2. 找内循环
  3. 根据内循环的操作确定成本模型。比如3Sum中的成本模型就是数组的访问次数(访问数组元素的次数)。
  4. 对于给定的输入,判断这些操作的执行频率。

常见的增长数量级分类

以下为常见的算法分析方程形式,与微积分中求极限常见的方程相同。

  1. 一行语句 a+b = c为常熟级别(1)
  2. 二分查找为对数级别(logN)
  3. 遍历数组为线性级别(N)
  4. 分治法,归并排序就是线性对数级别(nlogn)
  5. 双层循环是平方级别,selection sort, insertion sort(n2)
  6. 三层循环是立方级别(n3)
  7. 最差的是指数级别,比如穷举查找(2 to the n)

改进算法之three sum

3sum最简单的做法就是三层循环,时间为n3。但是我们可以把最内层循环用二分法搜索替换,那么运行时间的增长数量级可以提升为N2logN。(n的平方logn)

关于notation

这篇博客里有关于big O, omega, theta的解释。一般而言我们在讨论算法时间复杂度是时候是用big o的。代表着这个算法的最坏情况(只有上界没下界)。omega表示只有下界没有上界(最优复杂度)。而theta就对算法进行最精准的描述,因为if and only if函数 f(n) = O(g(n)) 并且 f(n)= Ω(g(n)) 时,才有 f(n) = θ(g(n))。

你可能感兴趣的:(算法,算法,数据结构,java)