要制定乙個演算法,一般要經過設計、確認、分析、編碼、檢查、除錯、計時等階段,因此學習計算機演算法必須涉及這些方面的內容。在這些內容中有許多都是現今重要而活躍的研究領域。為便於區別,把演算法學習的內容分成五個不同的方面:
(一)何設計演算法
設計演算法的工作是不可能完全自動化的。本書是要使讀者學會已被實踐證明是有用的一些基本設計策略。這些策略不僅在電腦科學,而且在運籌學、電氣工程等多個領域都是非常有用的,利用它們已經設計出了很多精緻有效的好演算法。讀者們一旦掌握了這些策略,也一定會設計出更多新的、有用的演算法。
(二)如何表示演算法
語言是交流思想的工具,設計的演算法也要用語言恰當地表示出來。本書基本採用結構程式設計的方式,選擇了一種名為sparks的程式語言來簡單明瞭地表示演算法。至於結構程式設計的內容本書並不打算具體介紹,而是將所能收集到的那些主要結構用於本書所給出的演算法之中,只是在本章的最後一節詳細討論了一種非常重要的結構——遞迴。
(三)如何確認演算法
一旦設計出了演算法,就應證明它對所有可能的合法輸入都能算出正確的答案,這一工作稱為演算法確認(algorithm validation)。要指出的是,用sparks所描述的演算法還不足以是乙個可以立即投入機器執行的程式。確認的目的在於使我們確信這一演算法將能正確無誤地工作,而與寫出這一演算法所用的程式語言無關。一旦證明了演算法的正確性,就可將其寫成程式,在將程式放到機器上執行之前,實際上還應證明程式是正確的,即證明程式對所有可能的合法輸入都能得到正確的結果,這一工作稱為程式證明(program proving)。這一領域是當前很多電腦科學工作者集中研究的物件,還處於相當初期的階段。在這一領域的工作還沒取得突破性的進展之前,為了增強對所編制程式的置信度,只能用對程式的測試來權宜代替。
(四)如何分析演算法
在前面對有窮性的討論中,曾提及只應把能在相當有窮步內終止的演算法實際投入計算機執行。細心的讀者可能當時就會覺得「相當」一詞用得非常含糊,能否對有窮步給出乙個數量界限呢?這實際上是我們要在這裡回答的問題。執行乙個演算法,要使用計算機的**處理器(cpu)完成各種運算,要用儲存器來存放程式和資料。演算法分析(analysis of algorithms)是對乙個演算法需要多少計算時間和儲存空間作定量的分析。分析演算法不僅可以預計所設計的演算法能在什麼樣的環境中有效地執行,而且可以知道在最好、最壞和平均情況下執行得怎麼樣,還可以使讀者對解決同一問題不同演算法的有效性作出比較判斷。關於演算法分析更確切的表徵將在下一節討論。
(五)如何測試程式
測試程式實際上由除錯和作時空分布圖兩部分組成。除錯
(debugging)
程式是在抽象資料集上執行程式,以確定是否會產生錯誤的結果,若有,則修改程式。但是,這一工作正如著名計算機科學家迪伊克斯特拉
(e.dijkstra)
所說的那樣,「除錯只能指出有錯誤,而不能指出它們不存在錯誤。」儘管如此,在程式正確性證明還沒取得突破性進展的今天,除錯仍是不可缺少且必須認真進行的一項重要工作。作時空分布圖是用各種給定的資料執行除錯認為是正確的程式,並測定為計算出結果所花去的時間和空間,以印證以前所作的分析是否正確和指出實現最優化的有效邏輯位置。
'); (window.slotbydup = window.slotbydup || ).push(); })();
'); (window.slotbydup = window.slotbydup || ).push(); })();
分類演算法有哪些
分類是資料探勘 機器學習和模式識別中乙個重要的研究領域。單一的分類方法主要包括 決策樹 貝葉斯 人工神經網路 k 近鄰 支援向量機和基於關聯規則的分類等 還有用於單一分類方法的整合學習演算法,如bagging和boosting等。1 決策樹 主要用於分類和 的技術之一,是以例項為基礎的歸納學習演算法...
陣列有哪些方法
一 操作方法 1 增 1 push 新增到陣列末尾任意或多個值 var getnumber 1 2,3 4 getnumber.push 5 6,7 console.log getnumber 那麼列印出來的getnumber就是 1,2,3,4,5,6,7 script 2 unshift 新增任...
Object有哪些方法
clone方法 protected native object clone throws clonenotsupportedexception 實現物件的淺拷貝,只有實現了cloneable介面才可以呼叫此方法,否則丟擲 clonenotsupportedexception異常 getclass方法...