什么是算法的復雜度?


算法復雜度分為時間復雜度空間復雜度。下面摘錄其含義:
時間復雜度:
時間復雜度是指執行算法所需要的計算工作量。
重點在其計算方法:
一個算法中的語句執行次數稱為語句頻度或時間頻度。記為T(n)。
一般情況下,算法的基本操作重復執行的次數是模塊n的某一個函數f(n),因此,算法的時間復雜度記做:T(n)=O(f(n))。
在計算時間復雜度的時候,先找出算法的基本操作,然后根據相應的各語句確定它的執行次數,再找出T(n)的同數量級(它的同數量級有以下:1,Log2n ,n ,nLog2n ,n的平方,n的三次方,2的n次方,n!),找出后,f(n)=該數量級,若T(n)/f(n)求極限可得到一常數c,則時間復雜度T(n)=O(f(n))。
在pascal中比較容易理解,容易計算的方法是:看看有幾重for循環,只有一重則時間復雜度為O(n),二重則為O(n^2),依此類推,如果有二分則為O(logn),二分例如快速冪、二分查找,如果一個for循環套一個二分,那么時間復雜度則為O(nlogn)。歸並排序就是這樣一種情況。
空間復雜度:
空間復雜度(Space Complexity)是對一個算法在運行過程中臨時占用存儲空間大小的量度,記做S(n)=O(f(n))。比如直接插入排序的時間復雜度是O(n^2),空間復雜度是O(1) 。而一般的遞歸算法就要有O(n)的空間復雜度了,因為每次遞歸都要存儲返回信息。
一個算法的空間復雜度只考慮在運行過程中為局部變量分配的存儲空間的大小,它包括為參數表中形參變量分配的存儲空間和為在函數體中定義的局部變量分配的存儲空間兩個部分。
Ex: 遞歸算法,其空間復雜度為遞歸所使用的堆棧空間的大小,它等於一次調用所分配的臨時存儲空間的大小乘以被調用的次數(即為遞歸調用的次數加1,這個1表示開始進行的一次非遞歸調用)。算法的空間復雜度一般也以數量級的形式給出。

大O符號:
在算法中代表了無限大趨近。例子如下: from wiki
解決一個規模為 n 的問題所花費的時間(或者所需步驟的數目)可以表示為:T(n)=4n^2-2n+2。當 n 增大時,n^2 項將開始占主導地位,而其他各項可以被 忽略。 舉例說明:當 n=500, 4n^2 項是 2n 項的1000倍大,因此在大多數場合下,省略后者對表達式的值的影響將是可以忽略不計的。
進一步看,如果我們與任一其他級的表達式比較, n^2 項的系數也是無關緊要的。例如:一個包含 n^3 或 n^2 項的表達式,即使 T(n)=1,000,000\cdot n^2,假定 U(n)=n^3,一旦 n 增長到大於 1,000,000,后者就會一直超越前者( T(1,000,000)=1,000,000^3=U(1,000,000) )。
這樣,大O符號就記下剩余的部分,寫作:
T(n)\in\Omicron(n^2)
或T(n)=\Omicron(n^2)
並且我們就說該算法具有 n^2階(平方階)的時間復雜度。
遞歸算法:
遞歸算法是一種直接或者間接地調用自身算法的過程。在計算機編寫程序中,遞歸算法對解決一大類問題是十分有效的,它往往使算法的描述簡潔而且易於理解。
重點內容
判斷:
遞歸算法所體現的“重復”一般有三個要求:
一、是每次調用在規模上都有所縮小(通常是減半);
二、是相鄰兩次重復之間有緊密的聯系,前一次要為后一次做准備(通常前一次的輸出就作為后一次的輸入);
三、是在問題的規模極小時必須用直接給出解答而不再進行遞歸調用,因而每次遞歸調用都是有條件的(以規模未達到直接解答的大小為條件),無條件遞歸調用將會成為死循環而不能正常結束。
為了理解, 最好參考網上代碼,進一步認證了解。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



關於算法復雜度 算法復雜度3 算法的復雜度 算法的復雜度 算法及其復雜度 各種算法復雜度 算法的復雜度 關於算法復雜度 算法的復雜度: 算法和算法復雜度
 
粤ICP备14056181号  © 2014-2021 ITdaan.com