數據結構和算法 | 第一部分第一課:什麼是數據結構和算法

程序 = 數據結構 + 算法

作者 謝恩銘,公衆號「程序員聯盟」。
轉載請註明出處。
原文:https://www.jianshu.com/p/b2f23799a5bb

內容簡介


  1. 前言
  2. 什麼是算法
  3. 算法無處不在
  4. 計算機的“特權”角色
  5. 什麼是數據結構
  6. 第一部分第二課預告

1. 前言


程序員應該知道:程序 = 數據結構 + 算法(Program = Data Structure + Algorithm )。

作爲一個程序員,如果不瞭解數據結構和算法,應該會不太好意思出門跟人家打招呼。

在這個課程裏,我會帶大家以循序漸進、輕鬆幽默的形式從入門到精通數據結構和算法,相信我們會度過一段非常愉快的時光。

你會發現,入門數據結構和算法,其實一點都不難。

話休絮煩,我們直接進入主題。

2. 什麼是算法


算法的英語是 Algorithm。

首先我們來思考一個問題:

什麼是算法?

要很準確地回答這個問題並不容易,但其實也沒那麼難,我不需要用一大堆理論來說清楚什麼是算法,況且算法也不僅限於 IT(Information Technology 的簡稱,表示“信息技術”)編程領域。

所以一個通俗易懂的回答可以是:

算法是以簡單概念的形式對如何解決問題的一種精確描述。

所以說:

  • 算法是一種描述(description),且是一種精確的描述。
  • 描述什麼?描述如何解決問題。
  • 以什麼樣的形式來描述?以簡單概念的形式。

說到問題,在日常生活中,我們經常需要解決問題。有的人可能每天需要解決很多問題,有的人可能就是問題本身。

下面我就來描述一個生活中的問題,從廣義上來考慮“問題”和“算法”的概念。

3. 無所不在的算法


我們可以用一個幾乎關乎所有人的問題來開始說明:烹飪。畢竟“民以食爲天”。

假設你餓了,你來到廚房,想整點什麼吃的,正好你看到了一包方便麪,然後你不自覺舔了舔舌頭,你想吃方便麪了(如果你正好是在睡覺前看到這裏,請不要打我。不鼓勵大家多吃方便麪。這裏的例子也可以是煮飯、煮麪或者烹飪其他食物),那你應該怎麼烹飪它呢?

這是一個簡單的過程(這裏只說最簡單的水煮的方式,請大家不要糾結烹飪的細節,也許你有其他更好的烹飪方便麪的方式):

  1. 在鍋子裏倒入適量水
  2. 在爐子上點起火來(如果是電磁爐就不用火)
  3. 把鍋子放在爐子上
  4. 等待水開,轉中火
  5. 把方便麪餅放入鍋中
  6. 煮半分鐘
  7. 放入所有調料包
  8. 煮 1 分鐘
  9. 出鍋

美味的方便麪

可以看到,我已經以簡單概念的形式精確描述瞭如何解決“煮方便麪”這個問題。

所以上面這套流程的描述,你可以把它稱爲“算法”,這個算法是專門針對“煮方便麪”這個問題的。

你會注意到上面的例子中有許多暗含的東西:我說你最初擁有一包方便麪,但你也需要鍋子、水,等。

我們可能會處於所有這些東西都不可用的特定情況下,然後我們就得使用另一種算法(或許先得自己造口鍋出來)。

上面的流程裏,我使用的各條指令(步驟)是比較“精確的”,但我們可以精簡到更少的指令,或擴充到更多指令。你也許會說,如果要更精確地說,得說明如何把水裝進鍋子裏。

如果要根據這個食譜來烹飪方便麪的人不知道如何執行“在鍋子裏倒入適量水”這一指令,則有必要用更簡單的術語解釋(例如,需要解釋如何使用水龍頭)。

類似地,在我們編程時,你使用的算法的精度取決於許多參數:你使用的編程語言,可用的庫,等等。

4. 計算機的“特權”角色


如果在日常生活中能找到算法的痕跡,爲什麼我們卻主要在計算機科學(Computer Science)中討論它呢?

原因很簡單:計算機(或電腦)非常擅長執行重複性任務。它們快速,高效,“任勞任怨”,從不喊累。

假設我們可以描述用於計算 3 的平方根的小數的算法(這算法得是人類可以操作的)。利用這個算法,你可以使用紙和筆來計算 3 的平方根的前 7 個小數位(1.7320508)。

但如果需要你計算 3 的平方根的前 10 萬個小數位呢?用紙和筆會計算到懷疑人生。這種時候,計算機將變得更加合適。

我們可以設計出不少用於信息處理的算法。說到信息處理,通常有以下幾類:

  • 研究
  • 比較
  • 分析
  • 分類
  • 提取

計算機通常在這些方面更加有優勢,可以很好地處理大量信息。

你可能已經想到了著名搜索引擎谷歌(最初谷歌正是靠着其搜索算法的實力才能主導市場,成就了今天超高的市值),但這種活動並不僅限於互聯網領域。

當你玩即時戰略遊戲(Real-Time Strategy Game,簡稱 RTS。例如紅警,星際爭霸,等等)的時候,如果你下達指令給一個單位,讓它移動。此時電腦需要掌握很多的信息(例如地圖的結構,單位的起點,單位的終點),它也必須產生新的信息:單位應走的路線。

所以其實算法源於生活(畢竟算法是人想出來的),但是我們通常在 IT 這個領域才討論算法,因爲計算機的特殊性。

5. 什麼是數據結構


上面說到了算法,現在我們來聊聊數據結構。數據結構的英語是 Data Structure。data 表示“數據”,structure 表示“結構”。

除了處理信息(數據是信息的符號表示或稱載體,信息則是數據的內涵)外,還必須考慮如何存儲信息。存儲信息的方式可能會對其處理方式產生非常重要的影響。

具體地說,我們可以用字典作爲例子。我們可以將字典定義爲“單詞及其定義的一個集合”(一個單詞對應一個定義)。

如果一部字典裏的單詞是胡亂排序的,這樣的字典應該很難使用吧。比如你要找一個單詞的定義,你得一頁頁地翻字典,直到找到那個單詞。

按字母順序來排列單詞顯然是一種非常有效的解決方案,可以快速找到你所要的單詞。因此,這是一種不錯的存儲信息的方式。

算法(描述方法)和數據結構(描述組織)之間存在非常緊密的聯繫。
簡單來說,對信息的存儲方式就是數據結構關心的事,對信息的處理方式就是算法關心的事。

通常,某些數據結構對於某些算法的實現至關重要;反之亦然。

例如,如果我們想要在已經按字母順序排列好的字典中添加一個新單詞,我們就不能只是將這個新單詞寫在字典的最後一頁的空白處,而是必須使用算法將其添加到正確的位置。

因此,數據結構的研究與算法的研究是密不可分的,我們需要同時來學習它們。

6. 第一部分第二課預告


今天的課就到這裏,一起加油吧!

下一課我們將用一個小故事來引出算法複雜度的學習(真正算法複雜度的講論將在第三課):

下一課:數據結構和算法 | 第一部分第二課:小鴨子們去度假


我是 謝恩銘,公衆號「程序員聯盟」號主,慕課網精英講師 Oscar 老師,終生學習者。
熱愛生活,喜歡游泳,略懂烹飪。
人生格言:「向着標杆直跑」

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章