時間複雜度
時間複雜度是什麼?
- 分析演算法執行時間
 - 假設每則指令執行時間相同
 
看看幾個程式
#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
時間複雜度
- 161