演算法的目標
演算法複雜度
大o函式
常見大o函式
1、演算法的目標
演算法是對問題的解決方案,但乙個問題會有很多種演算法,通常乙個好的演算法需要具備以下目標:
2、演算法複雜度
演算法複雜度用來衡量演算法的高效性,簡單的說就是:
然而,執行時間和語言、機器、機器的狀態、資料量的大小都有關係,不好橫向比較,為此通常使用乙個時間複雜度(相對度量)的概念來衡量演算法有多快。
我們假設其它狀態不變,僅當問題規模(資料大小)增長時,指令執行的次數也在增長,那麼指令執行次數相對於問題規模來說,會構成乙個函式t(n)。
例如-對於以下陣列求和的演算法1+2+3+…+n:
2、o(n)的例子int sum = 0; //指令數為1
:當存在正常數c和某個規模n0,如果對所有的n>=n0,都有f(n) <= c t(n),則稱f(n)為t(n)的大o函式,寫成:f(n) = o(t(n))。for(int i=0; i顯然,總的指令數為t(n) = n + 2
3、大o函式
假設乙個演算法的t(n) = 4n^3 - 2n + 5
當n越來越大時,對於t(n)增長的貢獻來說,最高端的n^3會佔據主導地位,其它項可被忽略。
例如:我們一般用大o函式來表示最主要的貢獻部分:o(t(n)) = o(n^3),也即演算法的時間複雜度。
數學定義
4、常見大o函式
函式名稱
例子o(1)
常數階交換演算法
o(logn)
對數階二分查詢演算法
o(n)
線性階求和演算法
o(nlogn)
線性對數階
快速排序演算法
o(n^2)
平方階氣泡排序演算法
o(n^c)
多項式階(c>1)
多重迴圈的演算法
o(c^n)
指數階漢諾塔問題
o(n!)
階乘階旅行商問題
1、計算方法
對演算法(或**)的指令次數進行計算組成t(n),只保留最高端項,然後去掉最高端項前面的常數。
例如以下**的t(n) = 3, 時間複雜度為o(1):
int a=20;
int b = a*3 + 4;
cout << b;
輸出陣列元素:
for(int i=0; i3、 o(logn)的例子
給定n,求2的指數p,使得p <= n < 2p
int p = 1;
while(p < n)
cout << p;
4、o(n^2)的例子
列印二維陣列:
for(int i=0; i5、o(nlogn)的例子
for(int i=0; i6、o(2^n) 的例子
漢諾塔問題-**略。
遞迴表示式:
將n-1個盤子從a經過c移動到b
將第n個盤子從a移動到c
將n-1個盤子從b經過a移動到c
顯然t(n) = 2t(n-1) + 1 = 2(2t(n-2) + 1) + 1 = ….,最高端項為2^n,即o(2^n)。
7、o(n!)的例子
旅行商問題:從乙個城市出發,經過所有城市後返回出發地,求最短的路徑。
如果用樸素演算法,第乙個城市有n種選擇,第二個有n-1種選擇,依次類推,複雜度為o(n!)。
8、空間複雜度
空間複雜度指演算法執行過程種臨時所占用的記憶體大小,例如變數、陣列等的開銷,規則與時間複雜度一樣。
在noi競賽裡,對於記憶體限制一般為128m(或256m),一般都足夠使用。
2演算法複雜度詳解
1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就...
2 演算法複雜度簡介
時間複雜度和空間複雜度是衡量演算法效率的重要的指標,而現實中對時間複雜度尤為關心,面試經常會問。但是一問到空間複雜度就容易卡殼。其實在演算法設計中,在規定量級空間複雜度去設計演算法是件非常有趣的事。時間複雜度 是指執行演算法所需要的計算工作量。其實就是所耗費的時間,但是用量級形勢將其表示出來 空間複...
演算法複雜度 時間複雜度和空間複雜度
1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數...