演算法的正確性
『壹』 一個好的演算法應該具備哪些特徵
一個好的演算法應該具畝悔備以下特徵:
正確性:演算法應該正確地解決問題,並且沒有明顯的錯誤。
易於理解:演算法應該清晰明了,容易理解,易於實現和調試。
可證明性:演算法應該有明確的證明,證明其正確性和最優性。
效率:演算法應該具有較高的效率,能夠在可接受的時間內完成計算。
穩定性:演算法的結果應該穩定,不會隨著數據的變化而變化。
適用性:演算法應該適用於不同的數據類型和規模
可源耐源擴展性:演算法應該具有可擴展性,能夠適應不斷增長的數據量。
雹態
『貳』 在演算法實現中,演算法的正確性如何保證
演算法本身的正確性用邏輯推理來證明,和數學定理類似
實現演算法的程序的正確性則是兩碼事
簡單的程序也用邏輯推理來證明,稍復雜的可以用某些專門驗證程序正確性的程序來驗證,再復雜的就沒什麼好辦法了,事實上很多復雜的程序在比較極端的輸入下或多或少都會有點問題
『叄』 演算法的正確性證明方法一: 循環不變數
在之前的一篇文章里寫到 演算法的正確性 的概念以及它的作用,下面就來寫寫循環不變數在演算法的正確性證明中的用法。
在使用循環的演算法里,可以通過循環不變數證明其正確性。
所謂循環不變數是指一種在整個循環過程中保持不變的性質,它必須在以下3種情況下均保持不變,且該性質源困在循環終止後能證明演算法的正確性。
接下來就 歸並排序(Merge sort) 中的 merge 函數來說明一下循環不變數
先解釋一下這個函數的作用,sld 和 srd 為已排序數組,大小分別為 lc 和 rc,循環 tc (lc + rc) 次把它們的元素進行比較並復制到新分配的數組 md 中,那要怎麼證明這個演算法的正確性呢。
讓我們先設定循環不變數,然後看8-18行的循環能否在以上3種情況都滿足這個循環不變數。
結束時循環不變數給了我們一個有用信息,此遲氏時 md 已經把 sld 和 srd 中全部元素合並排序了, 從雹旦念而證明了演算法的正確性。
『肆』 設計演算法的原則
設計演算法的原則:
1、正確性:演算法的正確性是指演算法至少應該具有輸入、輸出和加工處理無歧義性、能正確反映問題的需要、能夠得到問題的正確答案。
2、可讀性:設計演算法的目的,一方面是為了讓計算機執行,但還有一個重要的目的就是為了便於他人的閱讀,讓人理解和交流,自己將來也可閱讀。如果可讀性不好,時間長了自己都不知道寫了什麼,可讀性是評判演算法(也包括實現它的程序代碼)好壞很重要的標志。
3、健壯性:當輸入的數據非法時,演算法應當恰當地做出反應或進行相應處理,而不是莫名其妙的輸出結果。並且處理出錯的方法不應是中斷程序的執行,而應是返回一個表示錯誤或錯誤性質的值,以便於在更高的抽象層次上進行處理。
4、高效率與低存儲量:通常,演算法的效率指的是演算法的執行時間;演算法的存儲量指的是演算法執行過程中所需要的最大存儲空間,兩者的復雜度都與問題的規模有關。演算法分析的任務是對設計的每一個具體的演算法,利用數學工具,討論其復雜度,探討具體演算法對問題的適應性。
(4)演算法的正確性擴展閱讀:
演算法的「正確」通常在用法上有很大的差別,大體分為以下4個層次:
1、演算法程序沒有語法錯誤;
2、演算法程序能夠根據正確的輸入的值得到滿足要求的輸出結果;
3、演算法程序能夠根據錯誤的輸出的值滿足規格說明的輸出結果;
4、演算法程序對於精心設計、極其刁難的測試數據都能滿足要求的輸出結果。
對於這4層含義,層次要求最低,因為僅僅沒有語法錯誤實在談不上是好的演算法。而層次(4)是最困難的,人們幾乎不可能逐一驗證所有的輸入都得到正確的結果。因此,演算法的正確性在大部分情況下都不可能用程序來證明,而是用數學方法證明的。
『伍』 一個演算法的評價主要從哪些方面來考慮
一個演算法的評價主要從以下幾個方面來考慮:
1、時間復雜度
演算法的時間復雜度是指執行演算法所需要的計算工作量。一般來說,計算機演算法是問題規模n 的函數f(n),演算法的時間復雜度也因此記做。
T(n)=Ο(f(n))
因此,問題的規模n 越大,演算法執行的時間的增長率與f(n) 的增長率正相關,稱作漸進時間復雜度(Asymptotic Time Complexity)。
2、空間復雜度
演算法的空間復雜度是指演算法需要消耗的內存空間。其計算和表示方法與時間復雜度類似,一般都用復雜度的漸近性來表示。同時間復雜度相比,空間復雜度的分析要簡單得多。
3、正確性
演算法的正確性是評價一個演算法優劣的最重要的標准。
4、可讀性
演算法的可讀性是指一個演算法可供人們閱讀的容易程度。
5、健壯性
健壯性是指一個演算法對不合理數據輸入的反應能力和處理能力,也稱為容錯性。
(5)演算法的正確性擴展閱讀:
演算法可大致分為基本演算法、數據結構的演算法、數論與代數演算法、計算幾何的演算法、圖論的演算法、動態規劃以及數值分析、加密演算法、排序演算法、檢索演算法、隨機化演算法、並行演算法,厄米變形模型,隨機森林演算法。
演算法可以宏泛的分為三類:
一、有限的,確定性演算法 這類演算法在有限的一段時間內終止。他們可能要花很長時間來執行指定的任務,但仍將在一定的時間內終止。這類演算法得出的結果常取決於輸入值。
二、有限的,非確定演算法 這類演算法在有限的時間內終止。然而,對於一個(或一些)給定的數值,演算法的結果並不是唯一的或確定的。
三、無限的演算法 是那些由於沒有定義終止定義條件,或定義的條件無法由輸入的數據滿足而不終止運行的演算法。通常,無限演算法的產生是由於未能確定的定義終止條件。
『陸』 演算法及其特性有哪些
1.演算法的重要特性(1)有窮性:一個演算法必須在執行有窮步驟之後正常結束,而不能形成無窮循環。
(2)確定性:演算法中的每一條指令必須有確切的含義,不能產生多義性。
(2)可行性:演算法中的每一條指令必須是切實可執行的,即原則上可以通過已經實現的基本運算執行有限次來實現。
(4)輸入:一個演算法應該有零個或多個輸入。
(5)輸出:一個演算法應該有一個或多個輸出,這些輸出是同輸入有特定關系的量。
2.演算法描述的方法(1)框圖描述:該方法使用流程圖或N-S圖來描述演算法。
(2)自然語言描述:該方法採用自然語言,同時添加高級程序設計語言如while、for和if等基本控制語句來描述演算法。這類描述方法自然、簡潔,但缺乏嚴謹性和結構性。
(2)類語言描述:這是介於程序設計語言和自然語言之間演算法描述形式,其特徵是突出演算法設計的主體部分而有意忽略某些過於嚴格的語法細節,如類C或C++的偽語言。這種演算法不能直接在計算機上運行,但專業設計人員經常使用它來描述演算法,它具有容易編寫、閱讀和格式統一的特點。
(4)程序設計語言描述:採用某種高級程序設計語言(如C或C++)來描述。這是可以在計算機上運行並獲得結果的演算法描述。
本課程將採用偽C語言進行演算法描述。
2.演算法與程序的關系演算法的含義與程序十分相似,但二者是有區別的。演算法和程序都是用來表達解決問題的邏輯步驟;演算法是對解決問題方法的具體描述,程序是演算法在計算機中的具體實現;一個程序不一定滿足有窮性(死循環),而演算法一定滿足有窮性;程序中的指令必須是機器可執行的,而演算法中的指令則無此限制;一個演算法若用計算機語言來書寫,則它就可以是一個程序。因此,程序是演算法,但演算法不一定是程序。4.演算法設計要求在演算法設計中,對同一個問題可以設計出不同的求解演算法。如何評價這些演算法的優劣,從而為演算法設計和選擇提供可靠的依據?通常可從以下四個方面評價演算法的質量:
(1)正確性:演算法應該能夠正確地執行預先規定的功能,並達到所期望的性能要求。
(2)可讀性:演算法應該好讀,以有利於讀者對程序的理解,便於調試和修改。
(2)健壯性:演算法應具有容錯處理。當輸入非法數據時,演算法應對其作出反應,而不是產生莫名其妙的輸出結果。
(4)效率與低存儲量需求:效率指的是演算法執行的時間。對於同一個問題,如果有多種演算法可以求解,執行時間短的演算法效率高。演算法存儲量指的是演算法執行過程中所需要的最大存儲空間。高效率和低存儲量這兩者與問題的規模有關。
『柒』 演算法的五個重要特性
演算法的五個特徵是:有窮性,確切性,輸入項,輸出項,可行性。實際上就以上五個特性是沒法解釋演算法與程序的區別的。因為演算法是程序的概述,程序是演算法的實現,演算法所具有的特性,程序都具有。如果沒有演算法的支持,程序只是一堆無序的代碼。
演算法(Algorithm)是指解題方案的准確而完整的描述,是一系列解決問題的清晰指令,演算法代表著用系統的方法描述解決問題的策略機制。也就是說,能夠對一定規范的輸入,在有限時間內獲得所要求的輸出。如果一個演算法有缺陷,或不適合於某個問題,執行這個演算法將不會解決這個問題。不同的演算法可能用不同的時間、空間或效率來完成同樣的任務。一個演算法的優劣可以用空間復雜度與時間復雜度來衡量。
形式化演算法的概念部分源自嘗試解決希爾伯特提出的判定問題,並在其後嘗試定義有效計算性或者有效方法中成形。這些嘗試包括庫爾特·哥德爾、Jacques Herbrand和斯蒂芬·科爾·克萊尼分別於1930年、1934年和1935年提出的遞歸函數,阿隆佐·邱奇於1936年提出的λ演算,1936年Emil Leon Post的Formulation 1和艾倫·圖靈1937年提出的圖靈機。即使在當前,依然常有直覺想法難以定義為形式化演算法的情況。