時間複雜度
時間複雜度是什麼?
- 分析演算法執行時間
- 假設每則指令執行時間相同
看看幾個程式
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
cout << n << '\n';
return 0;
}
執行次數:4
#include<iostream>
using namespace std;
int main()
{
for(int i = 0; i < 10; i++){
cout << i << '\n';
}
}
執行次數: 31
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
for(int i = 0; i < n; i++){
cout << i << '\n';
}
}
執行次數: \(3n+3\)
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int a = 0;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
a++;
}
}
cout << a << '\n';
return 0;
}
執行次數: \(3n^2 + 3n + 4\)
BigO表示法
- 忽略係數
- 取最高位
\(3\)
\(31\)
\(3n + 3\)
\(3n^2 + 3n + 4\)
\(O(1)\)
\(O(1)\)
\(O(n)\)
\(O(n^2)\)
Big-O表示法
執行次數
如果你的程式有機會跑很快呢
看一下這個程式
#include<iostream>
using namespace std;
int a[10005];
int main(){
int n;
cin >> n;
for(int i = 0; i < n; i++){
cin >> a[i];
}
int search;
while(cin >> search){
bool found = 0;
for(int i = 0; i < n; i++){
if(search == a[i]){
cout << i << '\n';
found = 1;
break;
}
}
if(!found){
cout << -1 << '\n';
}
}
}這是一個循序搜尋的程式
如果他第一個就找到
那他是不是\(O(1)\)?
#include<iostream>
using namespace std;
int a[10005];
int main(){
int n;
cin >> n;
for(int i = 0; i < n; i++){
cin >> a[i];
}
int search;
while(cin >> search){
bool found = 0;
for(int i = 0; i < n; i++){
if(search == a[i]){
cout << i << '\n';
found = 1;
break;
}
}
if(!found){
cout << -1 << '\n';
}
}
}這是一個循序搜尋的程式
如果他第一個就找到
那他是不是\(O(1)\)?
估算時間複雜度時
要用最差狀況評估
常見的時間複雜度
\(O(1)\)
\(O(logn)\)
\(O(\sqrt{n})\)
\(O(n)\)
\(O(nlogn)\)
\(O(n\sqrt{n})\)
\(O(n^2)\)
\(O(n^3)\)
\(O(2^n)\)
快
慢
當然它也可以是各種排列組合
\(O(n\log^2n)\)
\(O(n \log n + q \log n)\)
不是所有內建函式都是O(1)
#include <iostream>
using namespace std;
int main()
{
char a[20];
cin >> a;
for (int i = 0; i < strlen(a); i++) {
cout << (char)(a[i] + 1);
}
return 0;
}
時間複雜度
By scottchou
時間複雜度
- 166