測力復雜演算法
『壹』 涓涓寮圭哀嫻嬪姏璁★紝涓よ竟杈瑰垎鍒鐢10N鍜5N鐨勫姏鍚戠浉鍙嶆柟鍚戞媺錛岄棶寮圭哀嫻嬪姏璁$殑紺烘暟
榪欑被闂棰樺彧瑕佽頒綇錛屽弽鏂瑰悜鐨勮瘽灝辨槸鐪嬪皬鐨勯偅涓鍔涳紝鍚屾柟鍚戠殑璇濆氨鏄0
鎵浠ュ氨鏄5N銆
濡傛灉鏄10N鍜3N錛屽弽鏂瑰悜錛岄偅涔堢瓟妗堝氨鏄3N
涓嶈佽涓婇潰鐨勭畻娉曡瀵間簡錛屽叧閿鏄瀛︿細鏂規硶
娣卞叆璇存槑
鍥犱負10N涓鐨5N鍜屽歸潰鐨5N騫寵浜嗭紝寮圭哀縐ゆ樉紺5N錛屽墿涓嬬殑5N娌℃湁鍙嶆柟鍚戠殑鍔涘鉤琛′粬錛岃繖鍓╀笅鐨5N鍙浼氫嬌寮圭哀縐よ繍鍔錛屾墍浠ュ脊綈хГ涓嶄細鍙嶆槧鍓╀笅鐨5N錛屽洜姝ゅ彧瑕佺湅灝忕殑閭d釜鍔涚殑澶у皬灝卞彲浠ヤ簡
『貳』 閲嶅姏鍔犻熷害鎬庝箞綆
閲嶅姏鍔犻熷害綆楁硶濡備笅錛
閲嶅姏鍔犻熷害鎸囩殑鏄鑷鐢辮惤浣撹繍鍔ㄤ腑鐗╀綋鍦ㄩ噸鍔涗綔鐢ㄤ笅鐨勫姞閫熷害錛岄氬父鐢╣琛ㄧず銆傚湪鍦扮悆琛ㄩ潰闄勮繎錛岄噸鍔涘姞閫熷害鐨勬爣鍑嗗間負9.8綾蟲瘡浜屾℃柟縐掋備笅闈㈡槸鍏充簬閲嶅姏鍔犻熷害鐨勮︾粏浠嬬粛銆
1銆佷粈涔堟槸閲嶅姏鍔犻熷害錛
5銆侀噸鍔涘姞閫熷害鐨勫簲鐢
鍦ㄧ墿鐞嗗︺佸湴璐ㄥ﹀拰鑸絀鴻埅澶╃瓑棰嗗煙錛岄噸鍔涘姞閫熷害鍏鋒湁騫挎硾鐨勫簲鐢ㄤ環鍊箋備緥濡傦紝閫氳繃嫻嬮噺閲嶅姏鍔犻熷害鍙浠ユ帹鏂鎵鍦ㄤ綅緗鐨勫湴璐ㄦ瀯閫狅紝浜嗚В鍦扮悆鍐呴儴鐨勭粨鏋勫拰瀵嗗害鍙樺寲錛涘湪鑸絀恆佸煎脊鍒跺肩瓑鏂歸潰錛岄噸鍔涘姞閫熷害涔熸槸榪涜岀簿紜璁$畻鐨勫熀紜銆
『叄』 演算法復雜度:時間復雜度和空間復雜度
本文部分摘抄於此
演算法復雜度分為時間復雜度和空間復雜度。
時間復雜度是指執行演算法所需要的計算工作量;
而空間復雜度是指執行這個演算法所需要的內存空間。
(演算法的復雜性體現在運行該演算法時的計算機所需資源的多少上,計算機資源最重要的是時間和空間(即寄存器)資源,因此復雜度分為時間和空間復雜度)。
一個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機運行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且一個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就多。一個演算法中的語句執行次數稱為語句頻度或時間頻度。記為T(n)。
在剛才提到的時間頻度中,n稱為問題的規模,當n不斷變化時,時間頻度T(n)也會不斷變化。但有時我們想知道它變化時呈現什麼規律。為此,我們引入時間復雜度概念。 一般情況下,演算法中基本操作重復執行的次數是問題規模n的某個函數,用T(n)表示,若有某個輔助函數f(n),使得當n趨近於無窮大時, T(n)/f(n) 的極限值為不等於零的常數,則稱f(n)是T(n)的同數量級函數。記作 T(n)=O(f(n)), 稱 O(f(n)) 為演算法的漸進時間復雜度,簡稱時間復雜度。
並且一個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就多。一個演算法中的語句執行次數稱為語句頻度或時間頻度。記為T(n)。
演算法中執行次數最多的那條語句就是基本語句,通常是最內層循環的循環體。
只需計算基本語句執行次數的數量級,這就意味著只要保證基本語句執行次數的函數中的最高次冪正確即可,可以忽略所有低次冪和最高次冪的系數。這樣能夠簡化演算法分析,並且使注意力集中在最重要的一點上:增長率。
將基本語句執行次數的數量級放入大Ο記號中。
如果演算法中包含嵌套的循環,則基本語句通常是最內層的循環體,如果演算法中包含並列的循環,則將並列循環的時間復雜度相加。
第一個for循環的時間復雜度為Ο(n),第二個for循環的時間復雜度為Ο( n 2),則整個演算法的時間復雜度為Ο(n+ n 2)=Ο( n 2)。
Ο(1)表示基本語句的執行次數是一個常數,一般來說,只要演算法中不存在循環語句,其時間復雜度就是Ο(1)。其中 Ο(log2n)、Ο(n)、 Ο(nlog2n)、Ο(n2)和Ο(n3) 稱為多項式時間, 而Ο(2n)和Ο(n!)稱為指數時間 。計算機科學家普遍認為前者(即多項式時間復雜度的演算法)是有效演算法,把這類問題稱為 P(Polynomial,多項式)類問題 ,而把後者(即指數時間復雜度的演算法)稱為 NP(Non-Deterministic Polynomial, 非確定多項式)問題 。
(4)在計算演算法時間復雜度時有以下幾個簡單的程序分析法則:
(1).對於一些簡單的輸入輸出語句或賦值語句,近似認為需要O(1)時間
(2).對於順序結構,需要依次執行一系列語句所用的時間可採用大O下"求和法則"
求和法則:是指若演算法的2個部分時間復雜度分別為 T1(n)=O(f(n))和 T2(n)=O(g(n)),則 T1(n)+T2(n)=O(max(f(n), g(n)))
特別地, 若T1(m)=O(f(m)), T2(n)=O(g(n)),則 T1(m)+T2(n)=O(f(m) + g(n))
(3).對於選擇結構,如if語句,它的主要時間耗費是在執行then字句或else字句所用的時間,需注意的是檢驗條件也需要O(1)時間
(4).對於循環結構,循環語句的運行時間主要體現在多次迭代中執行循環體以及檢驗循環條件的時間耗費,一般可用大O下"乘法法則"
乘法法則 : 是指若演算法的2個部分時間復雜度分別為 T1(n)=O(f(n))和 T2(n)=O(g(n)),則T1 * T2=O(f(n) * g(n))
(5).對於復雜的演算法,可以將它分成幾個容易估算的部分,然後利用求和法則和乘法法則技術整個演算法的時間復雜度
另外還有以下2個運演算法則:(1) 若g(n)=O(f(n)),則O(f(n))+ O(g(n))= O(f(n));(2) O(Cf(n)) = O(f(n)),其中C是一個正常數
(5)下面分別對幾個常見的時間復雜度進行示例說明:
(1)、O(1)
Temp=i; i=j; j=temp;
以上三條單個語句的頻度均為1,該程序段的執行時間是一個與問題規模n無關的常數。演算法的時間復雜度為常數階,記作T(n)=O(1)。 注意:如果演算法的執行時間不隨著問題規模n的增加而增長,即使演算法中有上千條語句,其執行時間也不過是一個較大的常數。此類演算法的時間復雜度是O(1)。
(2)、O(n2)
2.1. 交換i和j的內容
解: 因為Θ(2n2+n+1)=n2(Θ即:去低階項,去掉常數項,去掉高階項的常參得到),所以T(n)= =O(n2);
2.2.
解: 語句1的頻度是n-1
一般情況下,對步進循環語句只需考慮循環體中語句的執行次數,忽略該語句中步長加1、終值判別、控制轉移等成分,當有若干個循環語句時,演算法的時間復雜度是由嵌套層數最多的循環語句中最內層語句的頻度f(n)決定的。
(3)、O(n)
解:
(4)、O(log2n)
解:
(5)、O(n3)
解:
(5)常用的演算法的時間復雜度和空間復雜度
一個經驗規則: 其中c是一個常量,如果一個演算法的復雜度為c 、 log2n 、n 、 n log2n ,那麼這個演算法時間效率比較高 ,如果是 2n * , 3n ,n!,那麼稍微大一些的n就會令這個演算法不能動了,居於中間的幾個則差強人意。
演算法時間復雜度分析是一個很重要的問題,任何一個程序員都應該熟練掌握其概念和基本方法,而且要善於從數學層面上探尋其本質,才能准確理解其內涵。
2、演算法的空間復雜度
類似於時間復雜度的討論,一個演算法的空間復雜度(Space Complexity)S(n)定義為該演算法所耗費的存儲空間,它也是問題規模n的函數。漸近空間復雜度也常常簡稱為空間復雜度。
空間復雜度(Space Complexity)是對一個演算法在運行過程中臨時佔用存儲空間大小的量度。一個演算法在計算機存儲器上所佔用的存儲空間,包括存儲演算法本身所佔用的存儲空間,演算法的輸入輸出數據所佔用的存儲空間和演算法在運行過程中臨時佔用的存儲空間這三個方面。
演算法的輸入輸出數據所佔用的存儲空間是由要解決的問題決定的,是通過參數表由調用函數傳遞而來的,它不隨本演算法的不同而改變。存儲演算法本身所佔用的存儲空間與演算法書寫的長短成正比,要壓縮這方面的存儲空間,就必須編寫出較短的演算法。
演算法在運行過程中臨時佔用的存儲空間隨演算法的不同而異,有的演算法只需要佔用少量的臨時工作單元,而且不隨問題規模的大小而改變,我們稱這種演算法是「就地"進行的,是節省存儲的演算法,如這一節介紹過的幾個演算法都是如此;
有的演算法需要佔用的臨時工作單元數與解決問題的規模n有關,它隨著n的增大而增大,當n較大時,將佔用較多的存儲單元,例如將在第九章介紹的快速排序和歸並排序演算法就屬於這種情況。
如當一個演算法的空間復雜度為一個常量,即不隨被處理數據量n的大小而改變時,可表示為O(1);當一個演算法的空間復雜度與以2為底的n的對數成正比時,可表示為O(log2n);當一個演算法的空I司復雜度與n成線性比例關系時,可表示為O(n).
【1】如果演算法的執行時間不隨著問題規模n的增加而增長,即使演算法中有上千條語句,其執行時間也不過是一個較大的常數。此類演算法的時間復雜度是O(1)。
解答:
T(n)=O(1),
這個程序看起來有點嚇人,總共循環運行了1100次,但是我們看到n沒有?
沒。這段程序的運行是和n無關的,
就算它再循環一萬年,我們也不管他,只是一個常數階的函數
【2】當有若干個循環語句時,演算法的時間復雜度是由嵌套層數最多的循環語句中最內層語句的頻度f(n)決定的。
該程序段中頻度最大的語句是(5),內循環的執行次數雖然與問題規模n沒有直接關系,但是卻與外層循環的變數取值有關,而最外層循環的次數直接與n有關,因此可以從內層循環向外層分析語句(5)的執行次數:
則該程序段的時間復雜度為T(n)=O(n3/6+低次項)=O(n3)
【3】演算法的時間復雜度不僅僅依賴於問題的規模,還與輸入實例的初始狀態有關。
在數值A[0..n-1]中查找給定值K的演算法大致如下:
此演算法中的語句(3)的頻度不僅與問題規模n有關,還與輸入實例中A的各元素取值及K的取值有關:
(5)時間復雜度評價性能
有兩個演算法A1和A2求解同一問題,時間復雜度分別是T1(n)=100n2,T2(n)=5n3。
(1)當輸入量n<20時,有T1(n)>T2(n),後者花費的時間較少。
(2)隨著問題規模n的增大,兩個演算法的時間開銷之比5n3/100n2=n/20亦隨著增大。
即當問題規模較大時,演算法A1比演算法A2要有效地多。它們的漸近時間復雜度O(n2)和O(n3)從宏觀上評價了這兩個演算法在時間方面的質量。
在演算法分析時,往往對演算法的時間復雜度和漸近時間復雜度不予區分,而經常是將漸近時間復雜度T(n)=O(f(n))簡稱為時間復雜度,其中的f(n)一般是演算法中頻度最大的語句頻度。
其實生活很美好,只是你想的太多了。沒有,不會,有差距很正常,因為我不會