本頁使用了標題或全文手工轉換

演算法

維基百科,自由的百科全書
跳至導覽 跳至搜尋
應對燈泡不亮的簡單演算法流程圖

演算法(英語:algorithm),在數學算學)和電腦科學之中,指一個被定義好的、計算機可施行其指示的有限步驟或次序[1],常用於計算數據處理英語Data processing自動推理。演算法是有效方法英語Effective method,包含一系列定義清晰的指令[2],並可於有限的時間及空間內清楚的表述出來[3]

演算法中的指令描述的是一個計算,它執行英語Execution (computing)時從一個初始狀態和初始輸入(可能爲)開始,[4]經過一系列有限[5]而清晰定義的狀態最終產生輸出[6]停止於一個終態。一個狀態到另一個狀態的轉移不一定是確定的。包括隨機化演算法在內的一些演算法,都包含了一些隨機輸入。[7][8]

早在嘗試解決希爾伯特提出的判定問題時,演算法的不完整概念已經初步定型;在其後的正式化階段中人們嘗試去定義「有效可計算性英語Effective calculability[9]」或者「有效方法英語Effective method[10]」。這些嘗試包括庫爾特·哥德爾雅克·埃爾布朗史蒂芬·科爾·克萊尼分別於1930年、1934年和1935年提出的遞迴函式阿隆佐·邱奇於1936年提出的λ演算,1936年埃米爾·萊昂·珀斯特英語Emil Leon PostFormulation 1艾倫·圖靈1937年提出的圖靈機。即使在當下,依然常有符合直覺的想法難以定義爲形式化演算法的情況。[11]

歷史[編輯]

演算法在中國古代文獻中稱為「術」,最早出現在《周髀算經》、《九章算術》。特別是《九章算術》,給出四則運算最大公約數、最小公倍數、開平方根、開立方根、求素數埃氏篩,線性方程組求解的高斯消元法。三國時代的劉徽給出求圓周率的演算法:劉徽割圓術

自唐代以來,歷代更有許多專門論述「算法」的專著:

而英文名稱「algorithm」來自於9世紀波斯數學家花拉子米(比阿勒·霍瓦里松,波斯語:خوارزمی ‎,拉丁轉寫:al-Khwarizmi),因為比阿勒·霍瓦里松在數學上提出了演算法這個概念。「演算法」原為「algorism」,即「al-Khwarizmi」的音轉,意思是「花拉子米」的運演算法則,在18世紀演變為「algorithm」。

歐幾里得演算法被人們認為是史上第一個演算法。

第一次編寫程式是愛達·勒芙蕾絲Ada Byron)於1842年為巴貝奇分析機編寫求解解伯努利微分方程程式,因此愛達·勒芙蕾絲被大多數人認為是世界上第一位程式設計師[12]。因為查爾斯·巴貝奇Charles Babbage)未能完成他的巴貝奇分析機,這個演算法未能在巴貝奇分析機上執行。

因為「well-defined procedure」缺少數學上精確的定義,19世紀和20世紀早期的數學家、邏輯學家在定義演算法上出現了困難。20世紀的英國數學家圖靈提出了著名的圖靈論題,並提出一種假想的電腦的抽象模型,這個模型被稱為圖靈機。圖靈機的出現解決了演算法定義的難題,圖靈的思想對演算法的發展起到了重要的作用。

特徵[編輯]

以下是高德納在他的著作《電腦程式設計藝術》裡對演算法的特徵歸納:

MerkleTree1.JPG
  1. 輸入:一個演算法必須有零個或以上輸入量。
  2. 輸出:一個演算法應有一個或以上輸出量,輸出量是演算法計算的結果。
  3. 明確性:演算法的描述必須無歧義,以保證演算法的實際執行結果是精確地符合要求或期望,通常要求實際執行結果是確定的。
  4. 有限性:依據圖靈的定義,一個演算法是能夠被任何圖靈完備系統類比的一串運算,而圖靈機只有有限個狀態、有限個輸入符號和有限個轉移函式(指令)。而一些定義更規定演算法必須在有限個步驟內完成任務。
  5. 有效性:又稱可行性。能夠實現,演算法中描述的操作都是可以通過已經實現的基本運算執行有限次來實現。

基本要素[編輯]

演算法的核心是建立問題抽象的模型和明確求解目標,之後可以根據具體的問題選擇不同的模式和方法完成演算法的設計。

常用設計模式[編輯]

完全遍歷法和不完全遍歷法:在問題的解是有限離散解空間,且可以驗證正確性和最佳性時,最簡單的演算法就是把解空間的所有元素完全遍歷一遍,逐個檢測元素是否是我們要的解。這是最直接的演算法,實現往往最簡單。但是當解空間特別龐大時,這種演算法很可能導致工程上無法承受的計算量。這時候可以利用不完全遍歷方法——例如各種搜尋法和規劃法——來減少計算量。

分治法:把一個問題分割成互相獨立的多個部分分別求解的思路。這種求解思路帶來的好處之一是便於進行平行計算。

動態規劃法:當問題的整體最佳解就是由局部最佳解組成的時候,經常採用的一種方法。

貪婪演算法:常見的近似求解思路。當問題的整體最佳解不是(或無法證明是)由局部最佳解組成,且對解的最佳性沒有要求的時候,可以採用的一種方法。

線性規劃法:見條目。

簡併法:把一個問題通過邏輯或數學推理,簡化成與之等價或者近似的、相對簡單的模型,進而求解的方法。

常用實現方法[編輯]

遞迴方法迭代方法

順序計算、平行計算分散式計算:順序計算就是把形式化演算法用程式語言進行單執行緒序列化後執行。

確定性演算法和非確定性演算法

精確求解和近似求解

形式化演算法[編輯]

演算法是電腦處理資訊的本質,因為電腦程式本質上是一個演算法來告訴電腦確切的步驟來執行一個指定的任務,如計算職工的薪水或列印學生的成績單。一般地,當演算法在處理資訊時,會從輸入裝置或資料的儲存位址讀取資料,把結果寫入輸出裝置或某個儲存位址供以後再呼叫。

複雜度[編輯]

時間複雜度[編輯]

演算法的時間複雜度是指演算法需要消耗的時間資源。一般來說,電腦演算法是問題規模的函式,演算法的時間複雜度也因此記做

演算法執行時間的增長率與的增長率正相關,稱作漸近時間複雜度英語Asymptotic computational complexity,簡稱時間複雜度。

常見的時間複雜度有:常數階,對數階,線性階,線性對數階,平方階,立方階,...,次方階,指數階。隨著問題規模的不斷增大,上述時間複雜度不斷增大,演算法的執行效率越低。

空間複雜度[編輯]

演算法的空間複雜度是指演算法需要消耗的空間資源。其計算和表示方法與時間複雜度類似,一般都用複雜度的漸近性來表示。同時間複雜度相比,空間複雜度的分析要簡單得多。

非確定性多項式時間(NP)[編輯]

實現[編輯]

演算法不單單可以用電腦程式來實現,也可以在人工神經網路電路或者機械裝置上實現。

範例[編輯]

求最大值演算法[編輯]

這是演算法的一個簡單的例子。

我們有一串隨機數列。我們的目的是找到這個數列中最大的數。如果將數列中的每一個數字看成是一顆豆子的大小,可以將下面的演算法形象地稱為「撿豆子」:

  1. 首先將第一顆豆子放入口袋中。
  2. 從第二顆豆子開始檢查,如果正在檢查的豆子比口袋中的還大,則將它撿起放入口袋中,同時丟掉原先口袋中的豆子。反之則繼續下一顆豆子。直到最後一顆豆子。
  3. 最後口袋中的豆子就是所有的豆子中最大的一顆。

以上演算法在中國大陸的教科書中通常被叫做「打擂法」或者「迴圈打擂」[13][14][15]:在一個for迴圈中,每輪迴圈都有新的挑戰者。若挑戰者勝的話,挑戰者做新擂主,否則擂主衛冕。for迴圈結束後輸出最後的擂主。

下面是一個形式演算法,用ANSI C代碼表示

int max(int *array, int size)
{
  int mval = *array;
  int i;
  for (i = 1; i < size; i++)
    if (array[i] > mval)
      mval = array[i];
  return mval;
}

求最大公約數演算法[編輯]

求兩個自然數的最大公約數 設兩個變數

  1. 如果,則交換
  2. 除以,得到餘數
  3. 判斷,正確則即為「最大公約數」,否則下一步
  4. 賦值給,將賦值給,重做第一步。

ANSI C代碼表示

//交換2數
void swapi(int *x, int *y)
{
  int tmp = *x;
  *x = *y;
  *y = tmp;
}

int gcd(int m, int n)
{
  int r;
  do
  {
    if (m < n)
      swapi(&m, &n);
    r = m % n;
    m = n;
    n = r;
  } while (r);
  return m;
}

利用if函式以及遞迴則能做出更為精簡的程式碼,更可省去交換的麻煩。(但是也因為遞迴呼叫,其空間複雜度提高)

int gcd(int a,int b)
{
    if(a%b)
        return gcd(b,a%b);
    return b;
}

分類[編輯]

註釋[編輯]

  1. ^ Thomas H. Cormen; Charles E. Leiserson; Ronald L. Rivest; Clifford Stein; 殷建平等譯. 第1章 算法在计算机中的作用. 算法导论 原書第3版. 北京: 機械工業出版社. 2013年1月: 3[5] [2017-11-14]. ISBN 978-7-111-40701-0 (中文). 
  2. ^ Well defined with respect to the agent that executes the algorithm: "There is a computing agent, usually human, which can react to the instructions and carry out the computations"(Rogers 1987:2).
  3. ^ "Any classical mathematical algorithm, for example, can be described in a finite number of English words"(Rogers 1987:2).
  4. ^ "An algorithm has zero or more inputs, i.e., quantities which are given to it initially before the algorithm begins"(Knuth 1973:5)
  5. ^ "A procedure which has all the characteristics of an algorithm except that it possibly lacks finiteness may be called a 'computational method'"(Knuth 1973:5)
  6. ^ "An algorithm has one or more outputs, i.e. quantities which have a specified relation to the inputs"(Knuth 1973:5)
  7. ^ Whether or not a process with random interior processes (not including the input) is an algorithm is debatable. Rogers opines that: "a computation is carried out in a discrete stepwise fashion, without use of continuous methods or analogue devices... carried forward deterministically, without resort to random methods or devices, e.g., dice" Rogers 1987:2).
  8. ^ Whether or not a process with random interior processes (not including the input) is an algorithm is debatable. Rogers opines that: "a computation is carried out in a discrete stepwise fashion, without use of continuous methods or analogue devices ... carried forward deterministically, without resort to random methods or devices, e.g., dice" Rogers 1987:2).
  9. ^ Kleene(史蒂芬·科爾·克萊尼)1943 in Davis 1965:274
  10. ^ Rosser(巴克利·羅瑟)1939 in Davis 1965:225
  11. ^ Moschovakis, Yiannis N. What is an algorithm?. Engquist, B.; Schmid, W. (編). Mathematics Unlimited—2001 and beyond. Springer. 2001: 919–936 (Part II) [2012-09-27]. (原始內容存檔於2021-04-24). 
  12. ^ Ada Lovelace honoured by Google doodle. The Guardian. 10 December 2012 [10 December 2012]. (原始內容存檔於2018-12-25). 
  13. ^ 2.4 赛场统分. 讀書頻道-IT技術圖書-51CTO.COM. [2017-06-07]. (原始內容存檔於2017-03-24). 
  14. ^ 实验3-9:循环打擂. 湖南科技大學程式設計線上評測(Online Judge). [永久失效連結]
  15. ^ 高中,算法与程序设计,教案. 在點網. [2017-06-07]. (原始內容存檔於2019-06-03). 

參考文獻[編輯]

參閱[編輯]

延伸閱讀[編輯]

[在維基數據]

維基文庫中的相關文字:欽定古今圖書整合·曆象彙編·曆法典·演算法部》,出自陳夢雷古今圖書整合

外部連結[編輯]