算法复杂度:
指算法在编写成可执行程序后,运行时所占用的资源,包括时间资源和内存资源,即对应的时间复杂度和空间复杂度。
时间复杂度:
一个算法所耗费的时间,理论上讲是无法计算出来的,需要实际运行才能知道,但我们不可能对每个算法实际上机测试,只需要知道哪个算法费时,哪个算法省时就行。算法花费的时间于算法中语句执行的次数成正比, 一个算法中语句执行的次数被称为语句频度或时间频度,记作T(n)。 而算法的时间复杂度是指执行算法所需要的计算工作量。
空间复杂度:
与时间复杂度类似,空间复杂度是指算法在计算机内执行时所需存储空间的度量。记作:
S(n)=O(f(n))
算法执行期间所需要的存储空间包括3个部分:
- 算法程序所占的空间;
- 输入的初始数据所占的存储空间;
- 算法执行过程中所需要的额外空间。
在许多实际问题中,为了减少算法所占的存储空间,通常采用压缩存储技术。
常见的时间复杂度:
Big O notation
0(1): Constant Complexity: Constant 常数复杂度
int n = 1000;
System.out.println("Hey - your input is:" + n );
int n = 1000;
System.out.println("Hey - your input is:" + n );
System.out.println("Hmm.. I'm doing more stuff with:"+ n );
System.out.println("And more:" + n);
O(log n): Logarithmic Complexity: 对数复杂度
for (int i=1; i < n; i = i*2){
System.out.println("Hey- I'm busy looking at:" + i);
}
O(n): Linear Complexity: 线性时间复杂度
for (int i = 1; i <= n; i++) {
System.out.println("Hey - 11m busy looking at: " + i);
}
O(n^2): N square Complexity 平方
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
System.out.println("Hey - 11m busy looking at:" + i + "and" + j);
}
}
O(n^3): N square Complexity 立方
O(2^n): Exponential Growth 指数
for (int i = 1; i <= Math.pow(2, n);i++){
System.out.println("Hey - I'm busy looking at:" + )
O(n!): Factorial 阶乘
for (int i = 1; i <= factorial(n);i++){
System.out.println("}-ley - I'm busy looking at:"+ i);
}
注意: 当许多代码合在一起,只看最高复杂度的代码
主定理:
在算法分析中,主定理(英语:master theorem)提供了用渐近符号(大O符号)表示许多由分治法得到的递推关系式的方法。这种方法最初由Jon Bentlery,Dorothea Haken和James B. Saxe在1980年提出,在那里被描述为解决这种递推的“天下无敌法”(master method)。此方法经由经典算法教科书Cormen,Leiserson,Rivest和Stein的《算法导论》 (introduction to algorithm) 推广而为人熟知。