二、【绪论】算法和算法评价
算法和算法評價
1 算法的基本概念
算法(Algorithm)是對特定問題求解步驟的一種描述,它是指令的有限序列,其中的每條指令表示一個或多個操作。一般具有下列5個重要特性:
2 算法效率的度量
算法效率的度量是通過時間復雜度和空間復雜度來描述的。
2.1 算法運行時間的估算
算法執(zhí)行時間需通過依據(jù)該算法編制的程序在計算機上運行時所消耗的時間來度量,而度量一個程序的執(zhí)行時間通常有兩種方法:
我們可以發(fā)現(xiàn),同一個算法在用不同的語言實現(xiàn),或者用不同的編譯程序編譯,或者是在不同計算機上運行時,效率都會不同。這說明用絕對的時間來衡量算法的效率是不合適的。我們希望找到一個不依賴與這些無關因素的度量標準。在上述5個條件中拋開與外部環(huán)境有關的因素,我們可以認為一個特定算法“運行工作量”的大小,只依賴于問題的規(guī)模。
對于一個規(guī)模固定的問題,我們可以嘗試去統(tǒng)計算法每一步操作的執(zhí)行次數(shù),用這個指標來衡量算法的效率。實際操作后,我們會發(fā)現(xiàn)這種做法過于困難,而且常常是沒有必要的。我們應該做的是找出算法中最重要的操作,即所謂的基本操作(Baisc Operation),它們對總運行時間的貢獻最大,然后計算它們的運行次數(shù)。根據(jù)以上原則,我們就不難發(fā)現(xiàn)一個算法中的基本操作往往是算法最內層循環(huán)中最費時的操作。例如,大部分排序算法是通過比較待排序的元素和交換元素這兩步來工作的,對于這類算法,比較和交換就是基本操作。再比如,我們想用一個for循環(huán)重復累加來計算數(shù)列{1,2,3,…,100}\{1, 2, 3, \dots, 100\}{1,2,3,…,100}的和,加法運算就是這個算法的基本操作。
這樣我們就建立起一個分析算法時間效率的框架:對于輸入規(guī)模為nnn的算法,統(tǒng)計它的基本操作執(zhí)行次數(shù),來對其效率進行度量。
我們約定copc_{op}cop?為特定計算機上一個算法基本操作的執(zhí)行時間,而C(n)C(n)C(n)是該算法需要執(zhí)行基本操作的次數(shù)。這樣,對運行在特定計算機上的算法程序的運行時間可以用下列公式計算:
T(n)≈copC(n)T(n) \approx c_{op}C(n) T(n)≈cop?C(n)
2.2 算法的最優(yōu)、最差和平均效率
我們在上一節(jié)提到以算法輸入規(guī)模為參數(shù)的函數(shù)可以合理地度量算法的效率。但是也有許多算法的運行時間不僅取決于輸入的規(guī)模,還取決于特定的輸入細節(jié)。例如,我們用下列算法來查找一個包含nnn個元素的數(shù)組中大小為KKK的元素:
算法 SequentialSearch(A[0, 1, ..., n-1], K)// 用順序查找在給定的數(shù)組中查找給定的值// 輸入:數(shù)組A[0, 1, ..., n-1]和查找鍵K// 輸出:返回第一個匹配K的元素的下標,如果沒有匹配元素則返回-1i ← 0while i < n and A[i] ≠ K doi ← i +1if i < n return ielse reurn -1假設我們數(shù)組中沒有我們要找的元素KKK,或是元素KKK在數(shù)組的最后一位,我們就需要遍歷完整個數(shù)組;假設數(shù)組第一位就是我們要找的元素KKK,那么算法只需要執(zhí)行一步。 很明顯,對于相同規(guī)模的數(shù)組,算法的運行時間也會產(chǎn)生很大的差異。
- 最差效率 (Worst-case Efficiency):指當輸入規(guī)模為nnn時算法在最壞情況下的效率。分析算法的最差效率有助于我們了解算法運行時間的上界,換句話說,在任何情況下,算法的運行時間不會超過最壞輸入情況下的運行時間Cworst(n)C_{worst}(n)Cworst?(n)。
- 最優(yōu)效率 (Best-case Efficiency):指當輸入規(guī)模為nnn時算法在最優(yōu)情況下的效率。最優(yōu)效率的分析不如最差效率分析重要,但是它也不是毫無用處。有些算法對于一些接近最優(yōu)輸入的有用輸入類型,也可以獲得類似最優(yōu)效率的良好性能。因此我們可以對輸入數(shù)據(jù)進行刻意挑選來獲得算法更好的性能。其次,如果一個算法的最優(yōu)效率都不能滿足要求,我們就可以立刻放棄對該算法的研究,不必進一步分析。
- 平均效率 (Average-case Efficiency):無論是最差還是最優(yōu)效率,都不能體現(xiàn)出在“隨機”情況下算法的效率,因此我們還需要平均效率。
2.3 漸進符號和基本效率類型
在上文我們用T(n)T(n)T(n)或t(n)t(n)t(n)來表示算法的運行時間,C(n)C(n)C(n)來表示基本操作的次數(shù),現(xiàn)在我們加入g(n)g(n)g(n)來表示和基本操作次數(shù)相比較的函數(shù)。
2.3.1 符號OOO
如果存在大于0的常數(shù)ccc和非負的整數(shù)n0n_0n0?,使得對于所有的n≥n0n \ge n_0n≥n0?,有t(n)≤cg(n)t(n) \le cg(n)t(n)≤cg(n),則說函數(shù)t(n)t(n)t(n)包含在O(g(n))O(g(n))O(g(n))中,記作t(n)∈O(g(n))t(n) \in O(g(n))t(n)∈O(g(n))
非正式來說,O(g(n))O(g(n))O(g(n))是增長次數(shù)小于等于g(n)g(n)g(n)的函數(shù)集合,例如,我們可以說100n+5∈O(n2)100n+5 \in O(n^2)100n+5∈O(n2)。
2.3.2 符號Ω\OmegaΩ
如果存在大于0的常數(shù)ccc和非負的整數(shù)n0n_0n0?,使得對于所有的n≥n0n \ge n_0n≥n0?,有t(n)≥cg(n)t(n) \ge cg(n)t(n)≥cg(n),則說函數(shù)t(n)t(n)t(n)包含在Ω(g(n))\Omega(g(n))Ω(g(n))中,記作t(n)∈Ω(g(n))t(n) \in \Omega(g(n))t(n)∈Ω(g(n))
Ω(g(n))\Omega(g(n))Ω(g(n))是增長次數(shù)大于等于g(n)g(n)g(n)的函數(shù)集合,例如n3∈Ω(n2)n^3 \in \Omega(n^2)n3∈Ω(n2)
2.3.3 符號Θ\ThetaΘ
如果存在大于0的常數(shù)c1c_1c1?,c2c_2c2?和非負的整數(shù)n0n_0n0?,使得對于所有的n≥n0n \ge n_0n≥n0?,有c2g(n)≤t(n)≤c1g(n)c_2g(n) \le t(n) \le c_1g(n)c2?g(n)≤t(n)≤c1?g(n),則說函數(shù)t(n)t(n)t(n)包含在Θ(g(n))\Theta(g(n))Θ(g(n))中,記作t(n)∈Θ(g(n))t(n) \in \Theta(g(n))t(n)∈Θ(g(n))
Θ(g(n))\Theta(g(n))Θ(g(n))是增長次數(shù)等于g(n)g(n)g(n)的函數(shù)集合。例如,12n(n?1)∈Θ(n2)\frac{1}{2}n(n-1) \in \Theta(n^2)21?n(n?1)∈Θ(n2)。
2.3.4 漸進符號的特性
根據(jù)漸進符號的正式定義,我們可以得到下列定理:
一、加法規(guī)則
如果t1(n)∈O(g1(n))t_1(n) \in O(g_1(n))t1?(n)∈O(g1?(n))并且t2(n)∈O(g2(n))t_2(n) \in O(g_2(n))t2?(n)∈O(g2?(n)),則
t1(n)+t2(n)∈O(maxg1(n),g2(n))t_1(n) +t_2(n) \in O(max{g_1(n), g_2(n)}) t1?(n)+t2?(n)∈O(maxg1?(n),g2?(n))
二、乘法規(guī)則
如果t1(n)∈O(g1(n))t_1(n) \in O(g_1(n))t1?(n)∈O(g1?(n))并且t2(n)∈O(g2(n))t_2(n) \in O(g_2(n))t2?(n)∈O(g2?(n)),則
t1(n)×t2(n)∈O(g1(n))×O(g2(n))∈O(g1(n)×g2(n))t_1(n) \times t_2(n) \in O(g_1(n)) \times O(g_2(n)) \in O(g_1(n) \times g_2(n)) t1?(n)×t2?(n)∈O(g1?(n))×O(g2?(n))∈O(g1?(n)×g2?(n))
(對于符號Ω\OmegaΩ和Θ\ThetaΘ,類似的斷言也成立。)
這些特性意味著算法的整體效率是由具有較大增長次數(shù)的部分所決定的,即它效率較差的那一部分。例如,我們使用下述這個兩部分算法來檢查數(shù)組中是否含有相等元素:1. 應用某種已知的排序算法對數(shù)組進行排序, 2. 掃描該有序數(shù)組,比較相鄰元素是否相等。假設第一部分的比較次數(shù)不會超過12n(n?1)\frac{1}{2}n(n-1)21?n(n?1)(屬于O(n2)O(n^2)O(n2)),而算法的第二部分比較次數(shù)不超過n?1n-1n?1 (因此屬于O(n)O(n)O(n)),該算法的整體效率應該屬于O(max{n2,n})=O(n2)O(max \{ n^2, n \}) = O(n^2)O(max{n2,n})=O(n2)。
2.4 時間復雜度
在了解了漸進符號后,我們就可以來定義時間復雜度了。
一個語句的頻度是指該語句在算法中被重復執(zhí)行的次數(shù)。我們通常將算法中所有語句的頻度之和記為T(n)T(n)T(n),它是該算法問題規(guī)模nnn的函數(shù),時間復雜度主要分析T(n)T(n)T(n)的數(shù)量級。因為在算法中基本操作的頻度和T(n)T(n)T(n)在同一個數(shù)量級,所以我們使用算法中基本操作的頻度f(n)f(n)f(n)來分析算法的時間復雜度:
T(n)=O(f(n))T(n) = O(f(n)) T(n)=O(f(n))
沒有特殊說明的情況下,我們說的時間復雜度都是指最差時間復雜度。如果一個算法的時間復雜度T(n)=O(f(n))T(n) = O(f(n))T(n)=O(f(n)),那么我們說該算法的問題規(guī)模為nnn,其執(zhí)行時間和f(n)f(n)f(n)成正比。
時間復雜度由問題規(guī)模nnn和輸入的初始狀態(tài)共同決定。
2.5 空間復雜度
算法的空間復雜度S(n)S(n)S(n)定義為該算法所耗費的存儲空間,它是問題規(guī)模nnn的函數(shù)。記為:
S(n)=O(g(n))S(n) = O(g(n)) S(n)=O(g(n))
算法原地工作是指算法所需的輔助空間為常量,即O(1)O(1)O(1)。
相關章節(jié)
第一節(jié) 【緒論】數(shù)據(jù)結構的基本概念
第二節(jié) 【緒論】算法和算法評價
第三節(jié) 【線性表】線性表概述
第四節(jié) 【線性表】線性表的順序表示和實現(xiàn)
第五節(jié) 【線性表】線性表的鏈式表示和實現(xiàn)
第六節(jié) 【線性表】雙向鏈表、循環(huán)鏈表和靜態(tài)鏈表
第七節(jié) 【棧和隊列】棧
第八節(jié) 【棧和隊列】棧的應用
第九節(jié) 【棧和隊列】棧和遞歸
第十節(jié) 【棧和隊列】隊列
總結
以上是生活随笔為你收集整理的二、【绪论】算法和算法评价的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python数据结构——tuple
- 下一篇: 三、【线性表】线性表概述