一个算法对于某个输入的循环次数是可以事先估计出来的_数据结构与算法:算法...
- 輸入:一個算法應以待解決的問題的信息作為輸入。
- 輸出:輸入對應指令集處理后得到的信息。
- 可行性:算法是可行的,即算法中的每一條指令都是可以實現的,均能在有限的時間內完成。
- 有窮性:算法執行的指令個數是有限的,每個指令又是在有限時間內完成的,因此整個算法也是在有限時間內可以結束的。
- 確定性:算法對于特定的合法輸入,其對應的輸出是唯一的。即當算法從一個特定輸入開始,多次執行同一指令集結果總是相同的。
算法1:依次相加? while do-while ?for
算法2:高斯解法:首尾相加*50? ? (1+10000)*10000/2 ?? 100*101/2
算法3:使用遞歸實現:sum(100) = sum(99)+100? ?sum(99)= sum(98)+99 ..... ? sum(2) = sum(1)+2 ? sum(1) = 1
算法的復雜性體現在運行該算法時的計算機所需資源的多少上,計算機資源最重要的是時間和空間資源,因此復雜度分為時間和空間復雜度
時間復雜度是指執行算法所需要的計算工作量;
空間復雜度是指執行這個算法所需要的內存空間。
時間復雜度(Time Complexity))定義
時間頻度:
一個算法執行所耗費的時間,從理論上是不能算出來的,必須上機運行測試才能知道。但我們不可能也沒有必要對每個算法都上機測試。一個算法花費的時間與算法中語句的執行次數成正比例,哪個算法中語句執行次數多,它花費時間就多。一個算法中的語句執行次數稱為語句頻度或時間頻度,表示為T(n),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)=O(f(n))或者說:時間復雜度就是時間頻度去掉低階項和首項常數。注意:時間頻度與時間復雜度是不同的,時間頻度不同但時間復雜度可能相同。比如:某兩個算法的時間頻度是?T(n) = 100000n2+10n+6 ???
T(n) = 10n2+10n+6 ? T(n) = n2? ??
但是時間復雜度都是 T(n) = O(n2)最壞時間復雜度和平均時間復雜度:最壞情況下的時間復雜度稱最壞時間復雜度。一般不特別說明,討論的時間復雜度均是最壞情況下的時間復雜度。?
這樣做的原因是:最壞情況下的時間復雜度是算法在任何輸入實例上運行時間的上界,這就保證了算法的運行時間不會比任何更長。
在最壞情況下的時間復雜度為T(n)=O(n),它表示對于任何輸入實例,該算法的運行時間不可能大于O(n)。?
平均時間復雜度是指所有可能的輸入實例均以等概率出現的情況下,算法的期望運行時間。鑒于平均復雜度
第一,難計算
第二,有很多算法的平均情況和最差情況的復雜度是一樣的。
所以一般討論最壞時間復雜度比如 我要求你在字典里查同一個字,告訴我這個字在字典的那一頁。如果一頁一頁的翻,你需要多少時間呢?
最優的情況就是這個字在第一頁,
最壞的情況就是這個字是 整本字典的最后一個字。
所以即使我故意為難你,你也不會花費比找整本字典最后一個字還長的時間。當然,此時聰明的你就會想用部首、筆畫等去查,才不要傻乎乎的一頁一頁翻,此時的你就會擇優選擇,因為此時你最壞的情況就是我給你部首筆畫最多、除部首外筆畫最多的一個超級復雜的一個字,但顯然比翻整本字典快得多。
為了進一步說明算法的時間復雜度,我們定義 Ο、Ω、Θ符號。
Ο(歐米可榮)符號給出了算法時間復雜度的上界(最壞情況? <=),比如T(n) =O(n2)
Ω(歐米伽)符號給出了時間復雜度的下界(最好情況 >=),比如T(n) =Ω(n2)
而Θ(西塔)給出了算法時間復雜度的精確階(最好和最壞是同一個階? =),比如T(n) =Θ(n2)
時間復雜度計算:根本沒有必要計算時間頻度,即使計算處理還要忽略常量、低次冪和最高次冪的系數,所以可以采用如下簡單方法:
找出算法中的基本語句;
計算基本語句的執行次數的數量級;
只需計算基本語句執行次數的數量級,這就意味著只要保證基本語句執行次數的函數中的最高次冪正確即可,
可以忽略所有低次冪和最高次冪的系數。這樣能夠簡化算法分析,并且使注意力集中在最重要的一點上:增長率。
用大Ο記號表示算法的時間性能。
將基本語句執行次數的數量級放入大Ο記號中。
一個簡單語句的時間復雜度為O(1)。
100個簡單語句的時間復雜度也為O(1)。(100是常數,不是趨向無窮大的n)
一個循環的時間復雜度為O(n)。
時間復雜度為O(log2 n)的循環語句。?
時間復雜度為O(n2)的二重循環。
時間復雜度為O(nlog2n)的二重循環。
時間復雜度為O(n2)的二重循環。
常數階O(1)?
對數階O(log2n)
線性階O(n)
線性對數階O(n*log2n)
平方階O(n2)?
立方階O(n3)
...
k次方階O(nk)
指數階O(2n)
階乘階O(n!)
大家發現對數階O(log2n)和線性階O(n)的效率差異了嗎,當n=10的8次方(1億)時,執行此時一個是1億次,一個是8次。
所以編寫算法時一定要注意時間復雜度的選擇。
空間復雜度(Space Complexity)):
算法的存儲量包括:?程序本身所占空間
輸入數據所占空間;
輔助變量所占空間
輸入數據所占空間只取決于問題本身,和算法無關,則只需要分析除輸入和程序之外的輔助變量所占額外空間。
空間復雜度是對一個算法在運行過程中臨時占用的存儲空間大小的量度,一般也作為問題規模n的函數,以數量級形式給出,記作:S(n) = O(g(n))空間復雜度分析1:
空間復雜度分析2:
注意:
空間復雜度相比時間復雜度分析要少
對于遞歸算法來說,代碼一般都比較簡短,算法本身所占用的存儲空間較少,但運行時需要占用較多的臨時工作單元;
若寫成非遞歸算法,代碼一般可能比較長,算法本身占用的存儲空間較多,但運行時將可能需要較少的存儲單元。
總結
以上是生活随笔為你收集整理的一个算法对于某个输入的循环次数是可以事先估计出来的_数据结构与算法:算法...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: freertos 定时器 不启动_Fre
- 下一篇: docker 镜像_Docker镜像分层