一. 時間複雜度
時間複雜度實際就是乙個函式,該函式計算的是執行基本操作的次
數,而不是程式執行時間。
1.在實際中通常關注的是演算法的最壞運**況。
乙個演算法的最壞情況的執行時間是在任意輸入下的執行時間上界。
一般情況下使用o漸進表示法來計算演算法的時間複雜度。
2.書寫方式:
例1:
void test(int n)
}for (int k = 0; k < 2 * n; ++k)
intcount = 10;
while (count--)
}
語句總執行次數:f(n) = n^2+2*n+10;
時間複雜度為o(n)=n^2;
例2:
void test4(int m, int n)}}
f(n,m) = 2*m*n
o(n)=o(m*n);
例3:
void test(int n)
}f(n)=10; o(n)=o(1);
例4:
int factorial(int n)//求n的階乘,遞迴法
}o(n)=n
常用的有7種:時間複雜度依次增加:
o(1)
二. 空間複雜度不是計算實際占用的空間,而是計算整個演算法的輔助空間單元個數,及所建立的變數個數。
遞迴演算法的空間複雜度=遞迴深度*每次遞迴所需的輔助空間。
int sum(int n)
空間複雜度:o(1);
三.例項解析
a.二分查詢演算法
非遞迴(迭代)
int binary_search(int *arr, int sz, int n)
else
if (arr[mid] < n)
else
return mid;
}return -1;
}時間複雜度為:o(logn)
空間複雜度為:o(1);//建立了臨時變數mid
遞迴
int binary_search(int *arr, int
left, int
right, int n)
else
if (arr[mid]>n)
else
return mid;
}else
return -1;
}每次對半查詢(類似摺紙)
時間複雜度: o(logn)
空間複雜度:o(logn)
b.斐波那契數列
遞迴:
long
long fib(int n)
時間複雜度o(2^n)
空間複雜度o(n)
**過程:
非遞迴:
int fib(int n)
while (n>2)
return c;
} 時間複雜度:o(n)
空間複雜度:o(1)
時間複雜度及空間複雜度
程式的時間複雜度指的是程式在執行過程中的運算次數,並為最壞情況下的運算次數 程式的空間複雜度指的是程式在執行過程中需要系統為其變數輔助開闢記憶體的多少 斐波那契序列用遞迴實現 include int fib int n int main 圖示為 從圖中可以看出斐波那契遞迴演算法中求解f n 必須先計...
時間複雜度 空間複雜度
時間複雜度 在電腦科學中,演算法的時間複雜度是乙個函式,它定性描述了該演算法的執行時間。這是乙個關於代表演算法輸入值的字串 的長度的函式。時間複雜度常用大o符號 表述,不包括這個函式的低階項和首項係數。計算時間複雜度的方法 1 只保留高階項,低階項直接丟棄 2 係數不要 3 執行次數是常數是為o 1...
時間複雜度 空間複雜度
演算法複雜度分為時間複雜度和空間複雜度。其作用 時間複雜度是指執行演算法所需要的計算工作量 而空間複雜度是指執行這個演算法所需要的記憶體空間。一 時間複雜度 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道...