什麼是演算法 , 演算法複雜度 ,表示形式 ,及分類
演算法的定義
演算法(Algorithm)是指解題方案的準確而完整的描述,是一系列解決問題的清晰指令,演算法代表著用系統的方法描述解決問題的策略機制。也就是說,能夠對一定規範的輸入,在有限時間內獲得所要求的輸出。如果一個演算法有缺陷,或不適合於某個問題,執行這個演算法將不會解決這個問題。不同的演算法可能用不同的時間、空間或效率來完成同樣的任務。一個演算法的優劣可以用空間複雜度與時間複雜度來衡量。 一個演算法應該具有以下七個重要的特徵: 演算法可以使用自然語言、虛擬碼、流程圖等多種不同的方法來描述。1、有窮性(Finiteness)
演算法的有窮性是指演算法必須能在執行有限個步驟之後終止
2、確切性(Definiteness)
演算法的每一步驟必須有確切的定義;
3、輸入項(Input)
一個演算法有0個或多個輸入,以刻畫運算物件的初始情況,所謂0個輸入是指演算法本身定出了初始條件;4、輸出項(Output)
一個演算法有一個或多個輸出,以反映對輸入資料加工後的結果。沒有輸出的演算法是毫無意義的;5、可行性(Effectiveness)
演算法中執行的任何計算步都是可以被分解為基本的可執行的操作步,即每個計算步都可以在有限時間內完成;(也稱之為有效性) 6、 高效性(High efficiency) 執行速度快,佔用資源少; 7、 健壯性(Robustness) 對資料響應正確。演算法的複雜度
同一問題可用不同演算法解決,而一個演算法的質量優劣將影響到演算法乃至程式的效率。演算法分析的目的在於選擇合適演算法和改進演算法。一個演算法的評價主要從時間複雜度和空間複雜度來考慮。時間複雜度
演算法的時間複雜度是指執行演算法所需要的時間。一般來說,計算機演算法是問題規模n 的函式f(n),演算法的時間複雜度也因此記做 T(n)=Ο(f(n)) 因此,問題的規模n 越大,演算法執行的時間的增長率與f(n) 的增長率正相關,稱作漸進時間複雜度(Asymptotic Time Complexity)。
空間複雜度
演算法的空間複雜度是指演算法需要消耗的記憶體空間。其計算和表示方法與時間複雜度類似,一般都用複雜度的漸近性來表示。同時間複雜度相比,空間複雜度的分析要簡單得多。
同一問題可用不同演算法解決,而一個演算法的質量優劣將影響到演算法乃至程式的效率。演算法分析
的目的在於選擇合適演算法和改進演算法。一個演算法的評價主要從時間複雜度和空間複雜度來考慮
1、時間複雜度
(1)時間頻度
一個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且一個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就多。一個演算法中的語句執行次數稱為語句頻度或時間頻度。記為T(n)。
(2)時間複雜度
在剛才提到的時間頻度中,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)) 為演算法的漸進時間複雜度,簡稱時間複雜度。
在各種不同演算法中,若演算法中語句執行次數為一個常數,則時間複雜度為O(1),另外,在時間頻度不相同時,時間複雜度有可能相同,如T(n)=n^2+3n+4與T(n)=4n^2+2n+1它們的頻度不同,但時間複雜度相同,都為O(n^2)。
按數量級遞增排列,常見的時間複雜度有:
常數階O(1),對數階O(log2n)(以2為底n的對數,下同),線性階O(n),
線性對數階O(nlog2n),平方階O(n^2),立方階O(n^3),...,
k次方階O(n^k),指數階O(2^n)。隨著問題規模n的不斷增大,上述時間複雜度不斷增大,演算法的執行效率越低。
2、空間複雜度
與時間複雜度類似,空間複雜度是指演算法在計算機內執行時所需儲存空間的度量。記作:
S(n)=O(f(n))演算法設計與分析的基本方法
1.遞推法
遞推演算法是一種用若干步可重複的簡運算(規律)來描述複雜問題的方法. 遞推是序列計算機中的一種常用演算法。它是按照一定的規律來計算序列中的每個項,通常是通過計算機前面的一些項來得出序列中的指定象的值。其思想是把一個複雜的龐大的計算過程轉化為簡單過程的多次重複,該演算法利用了計算機速度快和不知疲倦的機器特點。2.遞迴法
程式呼叫自身的程式設計技巧稱為遞迴( recursion)。 一個過程或函式在其定義或說明中有直接或間接呼叫自身的一種方法,它通常把一個大型複雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解,遞迴策略只需少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少了程式的程式碼量。遞迴的能力在於用有限的語句來定義物件的無限集合。一般來說,遞迴需要有邊界條件、遞迴前進段和遞迴返回段。當邊界條件不滿足時,遞迴前進;當邊界條件滿足時,遞迴返回。 注意: (1) 遞迴就是在過程或函式裡呼叫自身; (2) 在使用遞迴策略時,必須有一個明確的遞迴結束條件,稱為遞迴出口。3.窮舉法
窮舉法,或稱為暴力破解法,是一種針對於密碼的破譯方法,即將密碼進行逐個推算直到找出真正的密碼為止。例如一個已知是四位並且全部由數字組成的密碼,其可能共有10000種組合,因此最多嘗試10000次就能找到正確的密碼。理論上利用這種方法可以破解任何一種密碼,問題只在於如何縮短試誤時間。因此有些人運用計算機來增加效率,有些人輔以字典來縮小密碼組合的範圍。4.貪心演算法
貪婪演算法是一種對某些求最優解問題的更簡單、更迅速的設計技術。用貪婪法設計演算法的特點是一步一步地進行,常以當前情況為基礎根據某個優化測度作最優選擇,而不考慮各種可能的整體情況,它省去了為找最優解要窮盡所有可能而必須耗費的大量時間,它採用自頂向下,以迭代的方法做出相繼的貪心選擇,每做一次貪心選擇就將所求問題簡化為一個規模更小的子問題, 通過每一步貪心選擇,可得到問題的一個最優解,雖然每一步上都要保證能獲得區域性最優解,但由此產生的全域性解有時不一定是最優的,所以貪婪法不要回溯。 貪婪演算法是一種改進了的分級處理方法。其核心是根據題意選取一種量度標準。然後將這多個輸入排成這種量度標準所要求的順序,按這種順序一次輸入一個量。如果這個輸入和當前已構成在這種量度意義下的部分最佳解加在一起不能產生一個可行解,則不把此輸入加到這部分解中。這種能夠得到某種量度意義下最優解的分級處理方法稱為貪婪演算法。 對於一個給定的問題,往往可能有好幾種量度標準。初看起來,這些量度標準似乎都是可取的,但實際上,用其中的大多數量度標準作貪婪處理所得到該量度意義下的最優解並不是問題的最優解,而是次優解。因此,選擇能產生問題最優解的最優量度標準是使用貪婪演算法的核心。 一般情況下,要選出最優量度標準並不是一件容易的事,但對某問題能選擇出最優量度標準後,用貪婪演算法求解則特別有效。最優解可以通過一系列區域性最優的選擇即貪婪選擇來達到,根據當前狀態做出在當前看來是最好的選擇,即區域性最優解選擇,然後再去解做出這個選擇後產生的相應的子問題。每做一次貪婪選擇就將所求問題簡化為一個規模更小的子問題,最終可得到問題的一個整體最優解。5.分治法
分治法是把一個複雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題……直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合併。 分治法所能解決的問題一般具有以下幾個特徵: (1) 該問題的規模縮小到一定的程度就可以容易地解決(2) 該問題可以分解為若干個規模較小的相同問題,即該問題具有最優子結構性質。(3) 利用該問題分解出的子問題的解可以合併為該問題的解;(4) 該問題所分解出的各個子問題是相互獨立的,即子問題之間不包含公共的子子問題。6.動態規劃法
動態規劃是一種在數學和電腦科學中使用的,用於求解包含重疊子問題的最優化問題的方法。其基本思想是,將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解。動態規劃的思想是多種演算法的基礎,被廣泛應用於電腦科學和工程領域。 動態規劃程式設計是對解最優化問題的一種途徑、一種方法,而不是一種特殊演算法。不象前面所述的那些搜尋或數值計算那樣,具有一個標準的數學表示式和明確清晰的解題方法。動態規劃程式設計往往是針對一種最優化問題,由於各種問題的性質不同,確定最優解的條件也互不相同,因而動態規劃的設計方法對不同的問題,有各具特色的解題方法,而不存在一種萬能的動態規劃演算法,可以解決各類最優化問題。因此讀者在學習時,除了要對基本概念和方法正確理解外,必須具體問題具體分析處理,以豐富的想象力去建立模型,用創造性的技巧去求解。7.迭代法
迭代法也稱輾轉法,是一種不斷用變數的舊值遞推新值的過程,跟迭代法相對應的是直接法(或者稱為一次解法),即一次性解決問題。迭代法又分為精確迭代和近似迭代。“二分法”和“牛頓迭代法”屬於近似迭代法。迭代演算法是用計算機解決問題的一種基本方法。它利用計算機運算速度快、適合做重複性操作的特點,讓計算機對一組指令(或一定步驟)進行重複執行,在每次執行這組指令(或這些步驟)時,都從變數的原值推出它的一個新值。8.分枝界限法
分枝界限法是一個用途十分廣泛的演算法,運用這種演算法的技巧性很強,不同型別的問題解法也各不相同。分支定界法的基本思想是對有約束條件的最優化問題的所有可行解(數目有限)空間進行搜尋。該演算法在具體執行時,把全部可行的解空間不斷分割為越來越小的子集(稱為分支),併為每個子集內的解的值計算一個下界或上界(稱為定界)。在每次分支後,對凡是界限超出已知可行解值那些子集不再做進一步分支。這樣,解的許多子集(即搜尋樹上的許多結點)就可以不予考慮了,從而縮小了搜尋範圍。這一過程一直進行到找出可行解為止,該可行解的值不大於任何子集的界限。因此這種演算法一般可以求得最優解。 與貪心演算法一樣,這種方法也是用來為組合優化問題設計求解演算法的,所不同的是它在問題的整個可能解空間搜尋,所設計出來的演算法雖其時間複雜度比貪婪演算法高,但它的優點是與窮舉法類似,都能保證求出問題的最佳解,而且這種方法不是盲目的窮舉搜尋,而是在搜尋過程中通過限界,可以中途停止對某些不可能得到最優解的子空間進一步搜尋(類似於人工智慧中的剪枝),故它比窮舉法效率更高。演算法分類
演算法可大致分為基本演算法、資料結構的演算法、數論與代數演算法、計算幾何的演算法、圖論的演算法、動態規劃以及數值分析、加密演算法、排序演算法、檢索演算法、隨機化演算法、並行演算法。 演算法可以巨集泛的分為三類: 有限的,確定性演算法 這類演算法在有限的一段時間內終止。他們可能要花很長時間來執行指定的任務,但仍將在一定的時間內終止。這類演算法得出的結果常取決於輸入值。 有限的,非確定演算法 這類演算法在有限的時間內終止。然而,對於一個(或一些)給定的數值,演算法的結果並不是唯一的或確定的。 無限的演算法 是那些由於沒有定義終止定義條件,或定義的條件無法由輸入的資料滿足而不終止執行的演算法。通常,無限演算法的產生是由於未能確定的定義終止條件。
舉例
經典的演算法有很多,如:"歐幾里德演算法,割圓術,秦九韶演算法"。
演算法經典專著
目前市面上有許多論述演算法的書籍,其中最著名的便是《計算機程式設計藝術》(The Art Of Computer Programming) 以及《演算法導論》(Introduction
To Algorithms)。相關推薦
什麼是演算法 , 演算法複雜度 ,表示形式 ,及分類
演算法的定義 演算法(Algorithm)是指解題方案的準確而完整的描述,是一系列解決問題的清晰指令,演算法代表著用系統的方法描述解決問題的策略機制。也就是說,能夠對一定規範的輸入,在有限時間內獲得所要求的輸出。如果一個演算法有缺陷,或不適合於某個問題,執行這個演算
常見排序演算法時間複雜度及穩定性
排序演算法 平均時間複雜度 最壞時間複雜度 穩定性 選擇排序 O(N²) O(N²) 不穩定 氣泡排序 O(N²
數構與演算法 | 什麼是大 O 表示演算法時間複雜度
正文: 開篇我們先思考這麼一個問題:一臺老式的 CPU 的計算機執行 O(n) 的程式,和一臺速度提高的新式 CPU 的計算機運 O(n2) 的程式。誰的程執行效率高呢? 答案是前
大O演算法複雜度表示
序言:演算法的時間複雜度和空間複雜度都是用“大O表示法”來表示的。其中O是個常量。 常見的 排序演算法的時間複雜度: 氣泡排序、插入排序、希爾排序、選擇排序的時間複雜度是O(n^
如何理解演算法時間複雜度的表示
先從O(1) 來說,理論上雜湊表就是O(1)。因為雜湊表是通過雜湊函式來對映的,所以拿到一個關鍵 字,用雜湊函式轉換一下,就可以直
設任意n個整數存放於陣列A[1..n]中,試編寫演算法,將所有正數排在所有負數前面(要求:演算法時間複雜度為O(n))。
注意陣列的實際長度 #include <iostream> using namespace std; void sort(int A[],int n) { int i=0;//陣列的頭下標 int j,x; j=n-1;//陣列的尾下標 while
刪除連結串列中的某個數,演算法時間複雜度是O(n)
import java.util.Scanner; /** * */ /** * @author jueying: * @version 建立時間:2018-10-29 下午04:05:03 * 類說明 */ /** * @author jueying
在一個含有空格字元的字串中加入XXX,演算法時間複雜度為O(N)
import java.util.Scanner; /** * */ /** * @author jueying: * @version 建立時間:2018-10-18 下午10:54:54 * 類說明 */ /** * @author jueying
資料結構與演算法之複雜度分析篇
一、內容 最好情況時間複雜度、最壞情況時間複雜度、平均情況時間複雜度、均攤時間複雜度。 二、為什麼要引入這幾個概念? 有助於我們可以更加全面地表示一段程式碼的執行效率,同樣一段
演算法妙應用-演算法的複雜度
0、什麼是演算法的複雜度? 對於任何一個程式來說,都可以從三個方面進行分析,分別是 輸入、處理、輸出,也即 IPO(Input、Process、Output),這種分析方法對硬體和軟體程式都是適用的。 資料的來源(Input):可以是硬體感測器收集的,也可以是從網上爬取的...。資料的輸
2.資料結構和演算法——演算法時間複雜度
定義 在進行演算法分析時,語句總的執行次數T(n)時關於問題規模n的函式,進而分析T(n)隨n的變化情況並確定T(n)的數量級。演算法的時間複雜度,也就是演算法的時間度量,記作:T(n) = O(f(n))。它表示歲問題規模n的增大,稱作演算法的漸進時間複雜度,簡稱為時間複雜度
堆排序優化與幾個排序演算法時間複雜度
我們通常所說的堆是指二叉堆,二叉堆又稱完全二叉樹或者叫近似完全二叉樹。二叉堆又分為最大堆和最小堆。 堆排序(Heapsort)是指利用堆這種資料結構所設計的一種排序演算法,它是選擇排序的一種。可以利用陣列的特點快速定位指定索引的元素。陣列可以根據索引直接獲取元素,時間複雜度為O(1),也就是常量,因此對於取
常用資料結構與演算法時間複雜度求解
1.0 資料結構的相關概念 2.0 一些基本演算法的時間複雜度 O(1): int x=1; O(n): for(int i = 0; i < n; i++){ printf("%d",i); } O(lo
第一章作業2-演算法時間複雜度和空間複雜度
1-1 演算法分析的兩個主要方面是時間複雜度和空間複雜度的分析。 (1分) T 1-2 N^2logN和NlogN^2具有相同的增長速度。 (2分) F: N^2logN較快 ,取對數對增長影響還是蠻大的,畢竟裸的logn函式後期增長
演算法 - 空間複雜度 時間複雜度
關於演算法空間複雜度的問題 ‘演算法空間複雜度’,別以為這個東西多麼高大上,我保證你看完這篇文章就能明白。 最近在啃演算法,發現非常有趣。在我學習的過程中發現了一個問題,那就是空間複雜度的問題,它絕對是效率的殺手。 關於空間複雜度的介紹(摘自百度) 空間複雜度(Sp
演算法時間複雜度
時間複雜度 演算法複雜度分為時間複雜度和空間複雜度。其作用: 時間複雜度是指執行演算法所需要的計算工作量;而空間複雜度是指執行這個演算法所需要的記憶體空間。(演算法的複雜性體現在執行該演算法時的計算機所需資源的多少上,計算機資源最重要的是時間和空間(即暫存器)資
演算法筆記-複雜度分析1
演算法複雜度分析 是什麼 什麼是演算法複雜度分析? 通過時間和空間兩個維度來評估演算法和資料結構的效能。 用時間複雜度 (時間漸進複雜度) 和空間複雜度 (空間漸進複雜度)兩個概念來描述效能問題,統稱複雜度。 演算法複雜度描述的是演算法執行時間以及佔用空間與資料規模的關聯關係 演算法複
主定理求解演算法時間複雜度
主定理 所謂主定理,就是用來解遞迴方程的一種方法,此方法可以用來求解大多數遞迴方程。 設遞迴方程為T(n)=aT(n/b)+f(n) (其中a≥1,b>1) 主定理: 1. 如果存在常數ε>0有f(n)=O(n^(logb^a-ε)
利用遞迴樹求遞迴演算法時間複雜度
遞迴演算法時間複雜度的計算方程式一個遞迴方程: 在引入遞迴樹之前可以考慮一個例子: T(n) = 2T(n/2) + n2 迭代2次可以得: T(n) = n2 + 2(2T(n/4) + (n/2) 2) 還可以繼續迭代,將其完全展
演算法筆記-複雜度分析2
時間複雜度四個概念 本文創作靈感來源於 極客時間 王爭老師的《資料結構與演算法之美》課程,通過課後反思以及借鑑各位學友的發言總結,現整理出自己的知識架構,以便日後溫故知新,查漏補缺。 是什麼 什麼是時間複雜度四個概念 最好情況時間複雜度:在最理想的情況上,執行這段