1.2 作為一種技術的演算法
小結在決定學習演算法導論之前,需要首先明確幾個問題:
先問問自己是否清楚這些問題,是否對這些問題有求知慾,是否想深入研究,如果是請繼續往下看,或許你能從中找到答案!
非正式地說演算法就是任何良定義的計算過程,換言之,涉及計算的皆可以稱之為演算法。
同時我們也可以把演算法理解為一種工具,可以用於求解計算問題的工具。
ok,既然是求解工具,那麼就會有輸入和輸出,他們又是如何定義的。
書本中給出了關於排序問題的形式定義:
如輸入lin = < 1, 2, 3, 4, 5, 6>,輸出lout = <6, 5, 4, 3, 2, 1>,可以看到演算法對輸入序列做了乙個降序排列。那麼形如lin的序列可稱為排序問題的乙個例項。
在現實中有很多的演算法問題,有共有的兩個特徵:
存在許多候選解,但大多數候選解沒有解決手頭的問題。尋找真正的解或最優解是個很大的挑戰。
能解決實際應用的問題,如最短路徑演算法,在某些情況下可以解決快速、經濟地出行。
稍稍理解了一下演算法,我們再來看一下資料結構:
資料結構是一種儲存和組織資料的方式,旨在便於訪問和修改。不同的資料結構更像是工具箱,需要根據不同的實際應用場景選擇它們,以達到最優。
對於有些問題,我們可以稱之為難題,如np完全問題,但是研究它們又是非常有趣的:
當前的cpu基本是多核的,我們可以把多核計算機比作幾台計算機,所以在設計演算法時必須考慮並行性,如多執行緒演算法。
想象這樣乙個場景,計算機的執行效率是無限快的,儲存器是免費的。那真是太好了,因為不管什麼樣的程式,只要能執行就可以,你可以用暴力解法,並且完全不用去在執行效率上優化**,記憶體隨意分配,不用去**。但現實是不存在這種情況的,所以這就是我們接下來需要討論的。
為了解決同乙個問題,可能會有許多不同的演算法,如排序問題。
我們在書本中就學習了很多種排序演算法,如快排、選擇排序、歸併、基數、插排……
假設我們用冒泡和快排做比較。
大家都知道冒泡其實就是暴力演算法,用兩層迴圈就可以,執行效率是n2;快排增加了乙個哨兵,使每次比較的數量減少一部分,比較類似於二分搜尋,效率上是n*log(n)
當排序1000萬個數時,計算機a需要執行5.5個小時,計算機b只需要20分鐘,可見一斑,而且當問題規模再次擴大時,差距就更明顯了。所以對於演算法而言,效率是至關重要的。
我們應該把演算法看成一種技術,是否具有演算法知識與技術的堅實基礎是區分真正熟練的程式設計師與初學者的乙個特徵。在現代計算技術下,假如你不懂演算法或者懂得不多,你依然可以完成一些任務,但如果你研究演算法或者有好的演算法背景,那麼你就可以做更多的事。所以學習演算法吧!
演算法在計算中的作用
演算法 演算法就是任何良定義的計算過程,該過程取某個值或值的集合作為輸入並產生某個值或值的集合作為輸出。演算法問題 特徵 存在許多候選解,但絕大多數候選解都沒有解決手頭的問題。尋找真正的解或更好的解 存在實際應用。演算法解決的每個問題並不是都有乙個容易識別的候選解集。演算法的幾大內容 是一種儲存和組...
演算法導論 演算法在計算中的作用
非形式地說,演算法就是任何良定義 對於良定義我的理解是給出的定義是清晰,不是模稜兩可的 地計算過程,該過程取某個值或值的集合作為輸入並產生某個值或值的集合作為輸出。這樣演算法就是把輸入轉換成輸出的計算步驟的乙個序列。我們也可以把演算法看成是用於求解良說明的計算問題的工具。一般來說,問題陳述說明了期望...
演算法在計算機中的作用
一 演算法是什麼 演算法非形式地說,演算法就是任何良定義 沒有公理性的矛盾,不會推出與實際情況相悖的情況 的計算過程,該過程取某個值或值的集合作為輸入並產生某個值或值的集合作為輸出。這樣的演算法就是把輸入轉換成輸出的計算步驟的乙個序列。是描述乙個特定的計算過程來實現該輸入 輸出關係。比如 輸入序列為...