algs4.jar/Stopwatch

public static void main(String[] args){
   int[] a = In.readInts(args[0]);
   Stopwatch stopwatch = new Stopwatch();
   StdOut.println(ThreeSum.count(a));
   double time = stopwatch.elapsedTime(); // time since creation (in seconds)
}

复杂度计算

Log-log plot

For given data like in standard plot,

standard plot.png

way to find out its T(N) is by: Log-log plot:

log-log-plot.png

where we calculate by

lg(T (N)) = b lg N + c 
T (N) = a N^b, where a = 2^c

in this case,

b = 2.999
c = -33.2103

so,

T(N) = 1.006 × 10^–10 × N^2.999

Assume b = 3, run multi times to estimate a.

validation_a.png

常用公式

estimating_discrete.png

log-log plot 对应 复杂度

log-log-vs-expansive.png

常见复杂度

commen-classifacation-expansive.png

复杂度对比

Cases

衡量算法的方式

常用衡量符号

commonly-used-notations-of-algorithms-analyse

衡量一个具体问题的复杂度的例子

Goals

Upper bound. of A specific algorithm.

对于一个确定算法——“依次寻找每个值”,它的最坏情况下(如果每个都不是0)的复杂度,是 O(N)

Lower bound. Proof that no algorithm can do better.

事实上,对于任何一个算法,都必须检查每个值,因此这个问题下的所有算法,它们的最好时间复杂度也是 O(N),因此本问题的最低时间复杂度Ω,是 Ω(N)

Optimal algorithm.

于是我们获得结论,刚刚那个确定算法,的确是最佳算法了。

算法进化论

注意每个符号的意义,不要误将O(n)认为是算法复杂度,其实~(n)才是

Memory

Basic