返回目錄?
演算法(algorithm)是對特定問題求解步驟的一種描述,它是指令的有限序列,其中的每條指令表示乙個或多個操作。乙個演算法還具有下列5個重要特徵:
通常,乙個好的演算法應該考慮達到以下目標:
我們以時間複雜度
和空間複雜度
來度量演算法的效率。
乙個語句的頻度是指該語句在演算法中被重複執行的次數。演算法中所有語句的頻度之和計為t(n
)t_
t(n)
,它是該演算法規模n
nn的函式,時間複雜度
主要分析t(n
)t_
t(n)
的數量級。演算法中基本運算(最深層迴圈體內的語句)的頻度與t(n
)t_
t(n)
同數量級,因此通常採用演算法中基本運算的頻度f(n
)f_
f(n)
來分析演算法的時間複雜度。因此,演算法的時間複雜度
記為t(n
)=o(
f(n)
)t_ = o(})
t(n)=
o(f(
n))
,其中o
oo的含義是t(n
)t_
t(n)
的數量級,其嚴格的數學定義是:若t(n
)t_
t(n)和f(n
)f_
f(n)
是定義在正整數集合上的兩個函式,則存在正常數c
cc和n0n_
n0,使得當n≥n
0n\ge
n≥n0
時,都滿足0≤t
(n)≤
cf(n
)0\leq}\leq}
0≤t(n)
≤cf
(n)
。
個人理解:也就是說t(n牢記:0≤t)t_
t(n)
其實是對時間的cf(
n)的一
種放
縮cf_的一種放縮
cf(n)
的一種放
縮
(n)≤
cf(n
)0\leq}\leq}
0≤t(n)
≤cf
(n)
演算法的時間複雜度不僅僅取決於問題的規模n
nn,也取決於待輸入資料的性質(如輸入資料元素的初始狀態)。例如,在陣列a[0……n-1]中,查詢指定數值k
kk的演算法大致為:
(
1) i = n -1;
(2)while
(i >=
0&& a[i]
!= k)(3
) i--;(
4)return i;
該語句(3)
的頻度不僅僅與問題的規模n
有關,而且與例項中a
的各個元素的取值以及k
的取值也有關
所以,引入了最壞時間複雜度
,平均時間複雜度
和最好時間複雜度
的概念
一般總是在思考降低最壞時間複雜度
,以保證演算法執行的時間不會比它更長。
分析程式的兩個法則:
演算法的空間複雜度s(n
)s(n)
s(n)
定義為該演算法所耗費的儲存空間,它是問題規模n
nn的函式。記為s(n
)=o(
g(n)
)s(n) = o(g(n))
s(n)=o
(g(n
))乙個程式在執行時除需要儲存空間來存放本身所用的指令、常數、變數和輸入資料外,還需要一些對資料進行操作的工作單元和 儲存一些為實現計算所需資訊的輔助空間。若輸入資料所佔空間只取決於問題本身,和演算法無關, 則只需分析除輸入和 程式之外的額外空間。
演算法原地工作是指演算法所需的輔助空間為常量,即o(1
)o(1)
o(1)
。
資料結構 C 1 第 1 章 緒論
1.1.1 氣泡排序 時間複雜度,用大o記號 t n o n2 t n o n 2 t n o n2 void bubblesort1a n 1.1.2 演算法 演算法是指基於特定的計算模型,旨在解決某一資訊處理問題而設計的乙個指令序列。演算法應該具備 輸入與輸出,基本操作 確定性與可行性,難解性,...
資料結構和演算法(第 1 章) 什麼是資料結構和演算法
不知道你有沒有這樣的疑惑?為什麼一說資料結構或者演算法,它們總是會同時出現,這不應該是兩門課嗎?為什麼要整合到一起呢?接下來我們就帶著問題去了解一下資料結構和演算法之間的關係。什麼是資料結構?什麼是演算法?其實,這樣是沒辦法的事。為了定義的明確和嚴謹,就得加很多限制條件,這樣就不會讓定義模稜兩可,但...
資料結構和演算法緒論
讓程式設計改變世界 change the world by program 資料結構和演算法這門計算機必修課歷來無論在哪個學校,都是無比乏味和催人入睡的。因為很多時候,考研玩的不是智商,其實就是乙個人投入的時間而已。什麼是資料結構?資料結構是一門研究非數值計算的程式設計問題中的操作物件,以及它們之間...