演算法的執行效率
Ⅰ 程序執行的效率與與什麼有關
程序執行的效率跟演算法有關,而一個演算法的優劣可以用空間復雜度與時間復雜度來衡量。
1、空間復雜度是指演算法在計算機內執行時所需存儲空間的度量
2、一般情況下,演算法中基本操作重復執行的次數是問題規模n的某個函數,用T(n)表示,若有某個輔助函數f(n),使得當n趨近於無窮大時,T(n)/f(n)的極限值為不等於零的常數,則稱f(n)是T(n)的同數量級函數。記作T(n)=O(f(n)),稱O(f(n)) 為演算法的漸進時間復雜度,簡稱時間復雜度。
在各種不同演算法中,若演算法中語句執行次數為一個常數,則時間復雜度為O(1),另外,在時間頻度不相同時,時間復雜度有可能相同,如T(n)=n2+3n+4與T(n)=4n2+2n+1它們的頻度不同,但時間復雜度相同,都為O(n2)。
按數量級遞增排列,常見的時間復雜度有:
常數階O(1),對數階O(log2n),線性階O(n),線性對數階O(nlog2n),平方階O(n^2),立方階O(n^3),...,
k次方階O(n^k),指數階O(2^n)。隨著問題規模n的不斷增大,上述時間復雜度不斷增大,演算法的執行效率越低。
Ⅱ 演算法分析:如何分析一個演算法的效率好壞
當我們說演算法分析的時候我們在說什麼?(狹義的技術層面的定義):
演算法分析指的是: 對演算法在運行時間和存儲空間這兩種資源的利用效率進行研究 。
即時間效率和空間效率。
時間效率指演算法運行有多快;
空間效率指演算法運行時需要多少額外的存儲空間。
(時間效率也叫時間復雜度;空間效率也叫空間復雜度。)
在計算機時代早期,時間和空間這兩種資源都是及其昂貴的。但經過半個多世紀的發展,計算機的速度和存儲容量都已經提升了好幾個數量級。
現在空間效率已經不是我們關注的重點了,但時間效率的重要性並沒有減弱到這種可以忽略的程度。
所以,當我們分析一個演算法的的時候,我們只關注它的時間效率 。
當我們遇到一個演算法時,我們可以用這樣一個通用的思路去分析它:
首先第一卜伍知步考慮這個演算法的輸入規模是什麼?即輸入參數,再換句話說也就是待解決的問題有多大?
從這里入手是因為一個顯而易見的規律就是,不管使用什麼演算法, 輸入規模越大,運行效率肯定會更長 。
輸入規模的確定要根據具體要解決的實際問題的細節來決定,相同的問題不同的細節,輸入規模是不一樣的。比如:一個拼寫檢查的演算法,
如果演算法關注的是單獨的字元檢查,那麼字元的數量就是輸入規模的大小;
如果演算法關注的是片語搭配的檢查,那麼這個輸入規模就要比單獨的字元檢查的輸入規模要小,這里輸入規模就是詞的數量了。
接下來第二步考慮這個演算法的運行時間,即這個演算法運行地快慢。
我們可以簡單地用計時的方法,即某個演算法運行了多少毫秒。
但這個方式有一個缺陷就是在不同計算機上,相同演算法的運行時間是不一樣,因為有的電腦快有的電腦慢。
所以有沒有一種度量方法可以排除這些無關因素?
答案是肯定的,我們可以關注演算法執行了多少步,即 操作的運行次數 。而且為了簡化問題我們只需關注最重要的操作步驟,即所謂的 基本操作 ,因為基本操作已經足夠可以決定這個演算法的品質。
比如一個演算法通常是最內層的循環中是最費時的操作,那我們就只需要把它循環了多少次作為基本操作進行研究。
這里需要延伸的一點是在大規模的輸入情況下考慮執行次數的增長次數。因為針對小規模的輸入,在運行時間的差別上不太明顯。比如只對100個數字進行排序,不管你用什麼排序演算法,時間效率都差不多。只有在輸入規模變大的時候,演算法的差異才變得既明顯又重要了起來。
簡單來說,
如果一個演算法在輸入規模變大時,但運行時間平緩增長,那麼我們就可以說它就是一個效率高的演算法;
而如果一個演算法在輸入規模變大時,它的運行時間成指數級增長,那就可以說這個演算法的效率很差。
總而言之就是,對基本操作的大規模輸入情況下的變化的研究才更具有深遠意義。
當我們了解了輸入規模對演算法時間效率的會產生影響,但演算法的執行效率卻不僅僅只受輸入規模的影響,某些情況下,演算法的執行效率更取決於輸入參數的細節。
比如:一個簡單的順序查找的演算法,在數組里查找數字 9:
在數組 l1 = [1, 2, 3, 4, 5, 6, 7, 8, 9 ] 里查找數字 9 和在相同的輸入規模的另一個數組 l2 = [ 9 , 1, 2, 3, 4, 5, 6, 7, 8]里查找數字 9,在數組 l2 的執行效率肯定更高。
上面小例子中的兩個數組就體現了兩個極端: 輸入最優情況 和 輸入最壞情況 。
相對應的,
在輸入最優情況下的演算法就叫 最優效率 ;
在輸入最壞情況下的演算法就叫 最差效率 ;
在這里有兩個經驗性的規則:
在現實情況下,輸入是「隨機」的,既不會是最優輸入也不會是最壞輸入。所以這里又型消要引出一個概念,即: 平均效率 。
首先指出,我們絕不能用「最優效率」和「最差效率」的平均數求得 平均效率 ,即便有時間這個平均數和真正的 平均效率 巧合地一致。
正確的步驟是:我們要對輸入規模 n 做一些假設。
對於上面的順序查找演算法的例子,標準的假設有兩個:
基於這兩個假設求平均效率可得:
由此,平均效率橘燃 C(n) = p(n+1) / 2 + n(1-p)
由此可知,
從這個例子可以發現,平均效率的研究要比最差效率和最優效率的研究困難很多:
我們要將輸入規模 n 劃分為幾種類型,對於同類型的輸入,使得演算法的執行次數是相同的。
演算法是計算機科學的基礎,以後會繼續更新演算法相關的隨筆,對演算法感興趣的朋友歡迎關注本博客,也歡迎大家留言討論。
我們正處於大數據時代,對數據處理感興趣的朋友歡迎查看另一個系列隨筆:
利用Python進行數據分析 基礎系列隨筆匯總
Introction to The Design and Analysis of Algorithms, Third Edition by Anany Leitin
Ⅲ 演算法的執行效率與什麼有關
B對了吧,不過似乎不完整。這應該是數據結構的題目,數據的存儲結構將直接影響到演算法的執行效率的。比如用數組跟用鏈表的效果就是不一樣的,它們的查找、插入、刪除、排序都是不一樣的。