為什麼要學習演算法和資料結構?
這裡有一些想法。可能你會發現這個問題在任何演算法書的序言中回答,但無論如何,這是我的看法。
1)不受資料結構程式語言的約束
沒有對各種資料結構的瞭解,很容易限制在語言直接提供的資料結構方面思考解決方案。
如果您是Java程式設計師,您可能會考慮解決方案,只是在java.lang.util包中提供的內容。
那還有更多的東西 例如一個簡單的需求:在低端,基本的手機,作為使用者鍵入的東西,你想向用戶呈現“自動完成”功能。在語言/圖書館容易提供的資料結構方面的思考並沒有多大幫助。
一個簡單的特技 會在這裡幫忙。另一個例子,想想我們使用的任何網路網站 -
Facebook如何建議你的朋友,LinkedIn如何告訴personX是一個二級聯絡人?
一個圖形 資料結構有助於在這裡。
或者當有一個穩定的數字流入,你想保持最大的10個數字。(你沒有
奢侈的儲存所有的數字和排序) 最小的堆是一個去。
列表繼續..
2)更好的硬體不是解決方案
沒有額外的硬體將補償低效的演算法。超級計算機需要1周的時間才能使用插入排序排序十億個數字,而家庭計算機需要18分鐘,使用合併排序排序10億個數字。
插入排序:O(n 2)
合併排序:O(n logn)
3)你會遇到一些非常有趣,非直觀的解決問題的方法
給定一個n / 2個不同元素和另一個元素的n / 2個拷貝的陣列。找到缺少的元素。
那麼,我們都會想到的正常的解決方案是通過陣列進行線性掃描,並在最壞的情況下讀取n / 2 + 2個元素後找到缺少的元素。[最差的情況=所有n / 2個不同的數字首先出現在陣列中,然後數字 - 哪個重複出現n / 2次]
有趣的是,這樣可以更快地解決這個問題:
1
2
3
4
五
6
7
while(true) do
i = Rand.numberWithinRange(1 to n)
j = Rand.numberWithinRange(1 to n)
if(i!=j) and a[i]=a[j] then return i;
並且在10次迭代中演算法不退出的概率為0.1074!
“隨機化”證明是解決一些問題的驚人實用方法。
併為“隨機化”提供更多的“真實世界”的應用程式 - 隨機版本的快速排序是最實用/最有效的排序演算法之一!
準備好讓許多很酷的,非直觀的,令人驚奇的解決問題的方法感到驚訝
4)重新整理一點概率,對數和一些有趣的數學
有趣的是回到一些數學,特別是概率,期望值,對數。
5)學習一些有趣的設計範例
在學習不同的演算法的同時,您也可以掌握不同的演算法設計範例。
(分歧與征服,貪婪的方法,回溯,動態規劃)
當有一個新的問題要解決時,這個知識有助於提出一個有效的解決方案。
6)這是一個技巧
某些事情只是“知識” - 當需要時,可以沿著這個方向學習。
例如:沒有真正需要知道所有的“MVC”框架。知道一個就夠了 有必要使用一些其他的MVC框架?那可以沿途學習
但演算法和資料結構不屬於該類別。這是一個技巧,推匯出一個問題的演算法/這是一個分析複雜性的技巧,並且告訴哪個演算法是更好的演算法/提前學習是很好的。獲得技能是有趣的,對吧?
7)存在O(n)溶液時的二次複雜度
沒有一些演算法學習,當有效的解決方案已經存在時,我們很有可能提出無效的解決方案!
8)瞭解日常工具背後的內容
幾乎每一個我們使用的工具,日復一日地應用了一些很酷的演算法。
找到哪些演算法應用於哪裡可以是一個有趣的練習!