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

2021-02-07 程式設計師聯盟

引出算法複雜度的故事

兩種算法

兩種算法的對比

第一部分第三課預告

上一課 數據結構和算法 | 第一部分第一課:什麼是數據結構和算法 中,我們初步認識了數據結構和算法。

既然我們要開始學習算法,就不能不提一下算法複雜度。

但在我們開始談論算法的複雜度(Complexity)之前,我希望先給大家講個小故事。

這個輕鬆的小故事可以幫助你之後更好地理解算法複雜度。

之所以今天的故事標題是「小鴨子們去旅行」 ,是因為我之前看了《嚮往的生活》 第二季,何老師他們的住房邊上有一個羊圈,裡面有天霸和點點兩隻羊,羊圈的邊上是一個雞窩,雞窩裡後來也養了一窩小鴨子。

有幾次,這一窩小鴨子從夾縫裡偷溜出雞窩,跑到住房附近的田裡的小池子裡遊泳,甚是可愛。所以我就想到用小鴨子們來做例子。

小鴨子們

我們的故事是這樣的:

農夫 Oscar 是一個非常友善的農夫,他養了很多隻小鴨子(我知道你可能會在腦海裡想像它們長大的樣子,想像北京烤鴨的樣子… 好了,趕緊打住這「邪惡」的念頭)。

農夫 Osacr 和這些小鴨子們的關係很好,它們平時可以出窩去溜達,在冬天也可以享用一間帶暖氣的小屋子。但真正讓這些小鴨子們興奮的是:每年夏季最炎熱的時候,Oscar 會開著一輛卡車,載著小鴨子們到離家較遠的山腳下去度假,那裡有很多片小池塘。小鴨子們可以在小池塘裡覓食、嬉戲,度過愉快的時光。

出發之前,農夫 Oscar 會首先在他的大卡車上放入一個大箱子,再把小鴨子們一隻只裝在大箱子裡面。大箱子是正方形的,分為一個一個隔間,每隻小鴨子就臥在一個小隔間裡。長寬各有 N 個隔間,這裡的 N 是一個我們暫時還不知道的數。池塘的數目也是 N。

但是問題來了:在度假的時候,小鴨子們是有要求的,每隻小鴨子都跟 Oscar 說它們想要遠離喧囂,儘量到比較清淨(鴨子數目少一些)的池塘裡去。

以往的每年,農夫 Oscar 不想費腦子,所以他是這麼做的:

到達目的地之後,Oscar 把卡車停在那一片池塘(池塘數目是 N)附近,從卡車上下來,打開後車門,從那一箱子小鴨子裡捧出一隻來,然後問它:「你想去哪一個池塘?」 。一旦小鴨子選定了一個池塘,Oscar 就跑到那個池塘,把小鴨子放進去。

第一隻小鴨子被放到想去的池塘之後,Oscar 跑回卡車,接著問第二隻小鴨子它想選擇哪個池塘。

因為已經有一隻小鴨子選了其中一個池塘,既然這些小鴨子都希望去鴨少更清淨的池塘,所以第二隻小鴨子肯定會選一個還沒有小鴨子在其中的池塘,然後 Oscar 又是一頓小跑。

Oscar 就以這樣的方式接著問下一隻小鴨子,並把每隻小鴨子都放到它們想去的池塘。

N 個池塘已經漸漸開始被小鴨子們佔據。一旦有池塘裡面的鴨子數比其他池塘少,那麼小鴨子就會選擇這個池塘。顯然,小鴨子進去後,這個池塘的鴨子數就會增加。

你可以想見,在 Oscar 終於把所有小鴨子都放到它們想去的池塘之後,情景應該是:N 個池塘,每個池塘裡有相同數目的 N 只小鴨子。

今年,農夫 Oscar 已經有點厭倦每次必須來回於卡車和池塘之間,只為了放一隻小鴨子,太耗時也太耗體力。

他想到了一個好主意:每一次,他會捧起 N 只小鴨子,到一個空著的池塘裡,把這 N 只小鴨子放在裡面。然後,他回到卡車,再把另一批 N 只小鴨子放到一個空著的池塘。

這樣,他只需要往返卡車 N 次,即可把所有的小鴨子都放置完畢。而且結束的時候的情景,和往年一樣:N 個池塘,每個池塘裡有相同數目的 N 只小鴨子。

因為最終分配結果和往年一樣,小鴨子們也沒有任何抱怨。

農夫 Oscar 放置小鴨子到池塘的方法,我們可以稱之為「算法」 。因為這個算法是對「放置小鴨子」這個問題的一種精確描述。

往年的算法和今年的新算法,它們都滿足了最終的條件:放置結束後,沒有一個池塘的小鴨子數是多於或少於其他池塘的,每一個池塘都有 N 只小鴨子。

因此,往年的算法和今年的算法都滿足了小鴨子們的要求,都是合格的算法。

兩種算法的不同之處在於:往年的第一種算法,每隻小鴨子都要求 Oscar 把它放到一個不同的池塘,因此 Oscar 須要往返於卡車和池塘之間的次數和小鴨子的數目是一樣的,是 N x N,也就是 N 的平方。而今年的第二種算法,Oscar 只需要往返 N 趟。

毫無疑問,今年的新算法是更高效的,而且節省下的時間和鴨子的數目成正比。

假設 N 是 6,那麼大箱子有 6 行 6 列,小鴨子的數目就是 36 只。如果 Oscar 在卡車和池塘之間往返一次的平均時間是 5 分鐘,那麼第二種算法只需要 6 x 5 = 30 分鐘。而第一種算法卻需要 6 x 6 x 5 = 180 分鐘,也就是三小時,是第二種算法的 6 倍。

兩種算法的差異隨著鴨子數目的增多會繼續擴大:假設 N 是 24,那麼大箱子有 24 行 24 列,就有 576 只小鴨子。如果 Oscar 在卡車和池塘之間往返一次的平均時間還是 5 分鐘,那麼第二種算法只需要 24 x 5 = 120 分鐘,也就是 2 小時。而第一種算法卻需要 24 x 24 x 5 = 2880 分鐘,達到了 48 小時,是第二種算法的 24 倍。

 

顯然農夫 Oscar 的新算法好太多了。在計算機術語中,我們會說他的新算法更有效、性能更高。我們可以用「複雜性」(Complexity)來量化這種性能,我們將在下一課中學習算法的複雜度。

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

下一課:數據結構和算法 | 第一部分第三課:算法複雜度(上)

作者:謝恩銘

出處:公眾號「程式設計師聯盟」

原文連結:https://www.jianshu.com/p/31d14bd080d4

轉載請註明出處,謝謝合作!

歡迎將我的公眾號「設為星標」✨

右下角↘️點個「在看」

是對我很大的鼓勵和幫助

相關焦點

  • 我們到底該如何學習《數據結構與算法》
    不過最起碼考研或者是期末考試,這門課都是必須要學習的一門課。可見學校也比較重視。一、算法與數據結構到底是個什麼東東?在這裡我不想去解釋哪些常見的名詞了,像什麼是數據項、數據對象、元素等等這些概念。稍微有點基礎的人,對這些概念都應該很清楚,畢竟都是中國人。我主要想說一下,我們到底該如何理解數據結構與算法。1、什麼是數據結構?
  • 數據結構與算法?看這篇就夠了!!!
    真正讓程式設計師有區分度,企業招聘萬年不變的重點 —— 算法與數據結構但無論半路出家還是科班出身,除學生時代搞算法競賽的同學外真正用心學習過算法與數據結構太少太少對於後期想要學習算法與數據結構卻不得不面對以下問題:於是我們推出了「數據結構與算法365天特訓營」實時視頻直播
  • 算法與數據結構?看這篇就夠了
    真正讓程式設計師有區分度,企業招聘萬年不變的重點 —— 算法與數據結構但無論半路出家還是科班出身,除學生時代搞算法競賽的同學外真正用心學習過算法與數據結構太少太少對於後期想要學習算法與數據結構卻不得不面對以下問題:於是我們推出了「數據結構與算法365天特訓營」實時視頻直播
  • 數據結構和算法 四階段 72 篇總結!
    在所有基本功中,最核心的一定是數據結構與算法。王爭根據自己研讀數十本算法書籍和多年項目開發的經驗,精選了 20 個最實用數據結構和算法結合具體的軟體開發實例,由淺入深進行講解背後的設計思想,並適時總結一些實用「寶典」,保證你印象深刻,並且能夠迅速對應到實際工作場景中。
  • 前端學習數據結構與算法系列(一):初識數據結構與算法
    前言作為一個對算法沒有任何認知,非科班出身的前端程式設計師,如果想提高自己的能力,不再只寫業務代碼當一個應用工程師,算法是必須掌握的一門本領。算法也是一種思想,當你去讀一些優秀框架的源碼,如果對算法和數據結構一無所知,讀起來很困難,你無法理解人家為什麼要那樣寫,那樣寫的好處是什麼,接下來就跟大家分享下作為一個前端程式設計師,如何學習數據結構與算法。
  • 快速入門數據結構和算法
    本文簡要分享算法基礎、常見的數據結構以及排序算法,給同學們帶來一堂數據結構和算法的基礎課。文末福利:阿里雲開發者訓練營來了。一  前言1  為什麼要學習算法和數據結構?2  業務開發要掌握到程度? 二  數據結構基礎1  什麼是數據結構?數據結構是數據的組織、管理和存儲格式,其使用目的是為了高效的訪問和修改數據。數據結構是算法的基石。如果把算法比喻成美麗靈動的舞者,那麼數據結構就是舞者腳下廣闊而堅實的舞臺。2  物理結構和邏輯結構的區別?
  • JAVA必須掌握的數據結構和算法
    常見的數據結構鍊表LinkedHashSet LinkedList 底層數據結構由鍊表和哈希表組成。數據的添加和刪除都較為方便,就是訪問比較耗費時間。數組ArrayList 訪問數據十分簡單,而添加和刪除數據比較耗工夫堆堆是一種圖的樹形結構,被用於實現「優先隊列",優先隊列是一種數據結構,可以自由添加數據,但取出數據時要從最小值開始按順序取出
  • 黑馬程式設計師:程式設計師必學之數據結構介紹(第二部分)
    今天繼續分享數據結構,第一部分很受歡迎,接下來是第二部分!4、線性表4.1線性表線性表:零個或多個數據元素的有限序列。(概念:空表、直接前驅、直接後繼)(操作:插入、刪除)線性表的順序存儲結構:指在一段地址連續的存儲單元依次存儲線性表的數據元素。
  • 考研計算機 | 數據結構—結構算法
    2021計算機考研數據結構—結構算法算法的設計取決於數據(邏輯)結構,而算法的實現依賴於採用的存儲結構
  • 我們為什麼要學習數據結構和算法?
    對於我們來說,數據結構和算法是那麼熟悉,又是那麼陌生。作為計科院的學生,大學裡都接觸過,但是進入社會以後,我們看起來很少會用到這個。這時候不僅會想到一件問題,學習數據結構和算法真的有用嗎?不學習這個就不能做開發了嗎?在當今的IT行業裡面,有些人不懂數據結構和算法,也能做一輩子的開發,這沒啥毛病,但是兄弟們,開發是開發,那可不是研發啊。
  • 數據結構與算法大總結
    數據結構知識綜述一、前言經過一個學期對數據結構與算法的學習,對這門課程有了更深入的了解,了解到了數據結構的相關知識,明白了,數據結構的重要性及應用,回顧一個學期,通過這個小論文,來總結一學期的學習成果,數據結構這門課程,具有一定的深度和廣度,有其複雜性,我們一起來分析一下
  • 數據結構與算法分析筆記——最大子序列和
    數據結構與算法分析筆記——最大子序列和:給定整數 A1,A2,……,AN,求∑k=ijAk給定整數 A1,A2,……,AN,求∑k=ijAk說明:整數可能為負。所以我們看到,算法中包含了三個for循環,由外而內,第一層循環從0開始,取起點,第二層循環,從起點開始,跨越長度,取終點,第三層循環用於計算子截取到的子序列的和。算法分析:三層循環,每層最壞都可能要計算N次,所以,它的運行時間為O(N3)。
  • 數據結構和算法學習指南
    首先,這裡講的都是普通的數據結構和算法,咱不是搞競賽的,野路子出生,只解決常規的問題,以面試為最終目標。另外,以下是我個人的經驗的總結,沒有哪本算法書會寫這些東西,所以請讀者試著理解我的角度,別糾結於細節問題,因為這篇文章就是對數據結構和算法建立一個框架性的認識。
  • 好課資源共享:14.數據結構與算法進階班【完結】
    14.數據結構與算法進階班【完結】14.數據結構與算法進階班【完結】14.上癮:網際網路產品背後的秘密(完結)14.牛散訓練營——後遊資時代短線操盤手實訓班(更新中)14.李松蔚認知思維16講【完結】14.藍小雨丨上市公司老闆,教你年薪30萬的賺錢方法(完結)14.賈長松
  • 基於Python介紹算法和數據結構的在線互動書,240頁pdf
    算法和數據結構的研究是理解計算機科學的核心。學習計算機科學與學習其他困難的學科沒有什麼不同。要想成功,唯一的方法就是有意識地、不斷地接觸基本思想。初學計算機的科學家需要實踐,以便在繼續學習課程中較複雜的部分之前有一個徹底的了解。此外,初學者需要獲得成功的機會和獲得信心。本教材旨在作為數據結構和算法的第一門課程的教材,通常作為計算機科學課程的第二門課程教授。
  • java 數據結構與算法 之遞歸算法
    我們也只有一點一點的積累,趁現在有時間,今天討論一下java 的數據結構與算法:遞歸算法,希望能達到溫故而知新的效果。一。定義:遞歸(recursion):是指定義自身的同時又出現了對自身的引用。遞歸算法:同理一個算法直接或間接調用自己就叫遞歸算法。一個有意義的遞歸算法總是包含兩部分:遞歸的調用與遞歸的終止條件。二。
  • 數據結構常見的八大排序算法
    八大排序,三大查找是《數據結構》當中非常基礎的知識點,在這裡為了複習順帶總結了一下常見的八種排序算法。
  • 數據結構與算法:聊一聊在面試中被常問的那幾個基礎算法的理解
    上一周的幾篇文章主要分享了有關數據結構相關的知識,有興趣的可以翻回去看一下。前面我也說到:數據結構和算法是一對"相愛相殺的"組合,所以接下來要分享下我個人對於一些算法的理解和實現。本文將主要分享基礎的查找和排序(代碼基於python)既然要開始分享算法,那必然要先介紹下算法相關的一些基本術語,如下。
  • 【學習筆記】300分鐘搞定數據結構與算法
    優先級別可以是自定義的,例如,數據的數值越大,優先級越高;或者數據的數值越小,優先級越高。優先級別甚至可以通過各種複雜的計算得到。應用場景:從一堆雜亂無章的數據當中按照一定的順序(或者優先級)逐步地篩選出部分乃至全部的數據。優先隊列有三個重要的性質:1. 數組裡的第一個元素 array[0] 擁有最高的優先級別。2.
  • 手敲一遍數據結構和排序算法
    排序算法 性質記憶 冒泡排序 選擇排序 插入排序 快速排序 歸併排序 希爾排序 堆排序數據結構 數組 堆 棧 隊列 鍊表 二叉樹 二叉搜索樹 圖 哈希表搜索 廣度優先搜索 深度優先搜索附件 排序算法代碼點擊