1. 程式人生 > >為什麼要學習演算法和資料結構?

為什麼要學習演算法和資料結構?

這裡有一些想法。可能你會發現這個問題在任何演算法書的序言中回答,但無論如何,這是我的看法。

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)瞭解日常工具背後的內容

幾乎每一個我們使用的工具,日復一日地應用了一些很酷的演算法。

找到哪些演算法應用於哪裡可以是一個有趣的練習!