2 演算法複雜度

2021-09-25 19:08:39 字數 1835 閱讀 3506

演算法的目標

演算法複雜度

大o函式

常見大o函式

1、演算法的目標

演算法是對問題的解決方案,但乙個問題會有很多種演算法,通常乙個好的演算法需要具備以下目標:

2、演算法複雜度

演算法複雜度用來衡量演算法的高效性,簡單的說就是:

然而,執行時間和語言、機器、機器的狀態、資料量的大小都有關係,不好橫向比較,為此通常使用乙個時間複雜度(相對度量)的概念來衡量演算法有多快。

我們假設其它狀態不變,僅當問題規模(資料大小)增長時,指令執行的次數也在增長,那麼指令執行次數相對於問題規模來說,會構成乙個函式t(n)。

例如-對於以下陣列求和的演算法1+2+3+…+n:

int sum = 0; //指令數為1

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),也即演算法的時間複雜度。

數學定義:當存在正常數c和某個規模n0,如果對所有的n>=n0,都有f(n) <= c t(n),則稱f(n)為t(n)的大o函式,寫成:f(n) = o(t(n))。

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;

2、o(n)的例子

輸出陣列元素:

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 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數...