算法在計算中的作用
在決定學習算法導論之前,需要首先明確幾個問題:
- 什麼是算法?
- 爲什麼算法值得研究?
- 在計算機領域算法對於其他技術的作用是什麼?
先問問自己是否清楚這些問題,是否對這些問題有求知慾,是否想深入研究,如果是請繼續往下看,或許你能從中找到答案!
1.1 算法
非正式地說算法就是任何良定義的計算過程,換言之,涉及計算的皆可以稱之爲算法。
同時我們也可以把算法理解爲一種工具,可以用於求解計算問題的工具。
OK,既然是求解工具,那麼就會有輸入和輸出,他們又是如何定義的。
書本中給出了關於排序問題的形式定義:
如輸入Lin = < 1, 2, 3, 4, 5, 6>,輸出Lout = <6, 5, 4, 3, 2, 1>,可以看到算法對輸入序列做了一個降序排列。那麼形如Lin的序列可稱爲排序問題的一個實例。
在現實中有很多的算法問題,有共有的兩個特徵:
- 存在許多候選解,但大多數候選解沒有解決手頭的問題。尋找真正的解或最優解是個很大的挑戰。
- 能解決實際應用的問題,如最短路徑算法,在某些情況下可以解決快速、經濟地出行。
數據結構
稍稍理解了一下算法,我們再來看一下數據結構:
數據結構是一種存儲和組織數據的方式,旨在便於訪問和修改。不同的數據結構更像是工具箱,需要根據不同的實際應用場景選擇它們,以達到最優。
NP完全問題
對於有些問題,我們可以稱之爲難題,如NP完全問題,但是研究它們又是非常有趣的:
- 對於NP完全問題,是否存在有效算法是未知的,如果你可以研究出來,那麼你就是第一個
- 如果任何一個NP完全問題存在有效算法,那麼所有NP完全問題都存在有效算法
- 有幾個不完全同於NP完全問題已有有效算法,通過一個小小的改變或許就能提升最佳算法的效率
並行性
當前的CPU基本是多核的,我們可以把多核計算機比作幾臺計算機,所以在設計算法時必須考慮並行性,如多線程算法。
1.2 作爲一種技術的算法
想象這樣一個場景,計算機的執行效率是無限快的,存儲器是免費的。那真是太好了,因爲不管什麼樣的程序,只要能執行就可以,你可以用暴力解法,並且完全不用去在執行效率上優化代碼,內存隨意分配,不用去回收。但現實是不存在這種情況的,所以這就是我們接下來需要討論的。
效率
爲了解決同一個問題,可能會有許多不同的算法,如排序問題。
我們在書本中就學習了很多種排序算法,如快排、選擇排序、歸併、基數、插排……
假設我們用冒泡和快排做比較。
大家都知道冒泡其實就是暴力算法,用兩層循環就可以,執行效率是n2;快排增加了一個哨兵,使每次比較的數量減少一部分,比較類似於二分搜索,效率上是n*log(n)
當排序1000萬個數時,計算機A需要執行5.5個小時,計算機B只需要20分鐘,可見一斑,而且當問題規模再次擴大時,差距就更明顯了。所以對於算法而言,效率是至關重要的。
算法與其他技術
我們應該把算法看成一種技術,是否具有算法知識與技術的堅實基礎是區分真正熟練的程序員與初學者的一個特徵。在現代計算技術下,假如你不懂算法或者懂得不多,你依然可以完成一些任務,但如果你研究算法或者有好的算法背景,那麼你就可以做更多的事。所以學習算法吧!
小結
- 在選擇算法是應充分考慮算法的效率
- NP完全問題是非常有趣的
- 算法是一種技術,如果我們要做好的coder,務必掌握它