時間複雜度

時間複雜度是什麼?

  • 分析演算法執行時間
  • 假設每則指令執行時間相同

看看幾個程式

#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