圖書館/資料結構與演算法輕鬆學
資料結構與演算法輕鬆學 book cover - Leapahead summary
收聽重點 1
0:000:00

資料結構與演算法輕鬆學

納拉辛哈.卡魯曼奇

時長38 分鐘
重點8 重點
評分4.4 評分

內容重點

透過淺顯易懂的說明與實用範例,深入了解電腦科學的核心——資料結構與演算法,幫助你輕鬆解決各種複雜的運算難題。

您將學到

學習1. 資料結構與演算法的基礎
學習2. 破解棘手的演算法題目
學習3. 提升程式撰寫速度的技巧
學習4. 資料結構的知識與應用
學習5. 解決程式設計中的問題
學習6. 在技術面試中脫穎而出

重點

01蓋房子前,先打好地基

我們來聊聊寫程式這件事吧。很多人,包括以前的我,都覺得寫程式嘛,就是把功能做出來就好,程式能跑、需求有滿足,不就好了嗎?這個想法,就像是蓋房子只求能遮風避雨,卻不管地基穩不穩、鋼筋牢不牢。短期來看,好像沒什麼問題,但時間一久,問題就通通跑出來了。你的App開始變慢、動不動就當機,或是老闆突然說要加個新功能,你一看程式碼,頭就開始痛,完全不知道從何下手。這時候,你就需要回頭來補強那個最重要,卻也最容易被忽略的東西——「資料結構」與「演算法」。 聽起來是不是有點學術、有點可怕?別擔心,我們今天不談那些複雜的數學公式,把它想像成我們在廚房做菜吧。你要做一道菜,首先需要什麼?當然是食材,對吧?像是雞蛋、番茄、青蔥等等。這些「食材」,在程式的世界裡,就是我們的「資料」。那你要怎麼放這些食材呢?你可以全部亂七八糟地堆在桌上,也可以分門別類地放進不同的盤子、碗裡。例如,雞蛋放在蛋盒,番茄放進碗裡,蔥切好放在小碟子上。這種「整理、存放食材的方式」,就是所謂的「資料結構」。它決定了你的廚房(也就是你的程式記憶體)乾不乾淨、整不整齊。 有了整理好的食材,接下來呢?你就要開始做菜了。你是要先炒蛋,還是先炒番茄?要不要加醬油?要加多少?這整個做菜的「步驟」和「流程」,就是所謂的「演算法」。一個好的演算法,就像一份厲害的食譜,能讓你用最有效率的方式,做出最美味的料理。相反地,一個爛的演算法,可能會讓你手忙腳亂,最後煮出一道黑暗料理。 所以你看,資料結構和演算法,根本就不是什麼高深莫測的東西,它就是「整理資料的方法」和「解決問題的步驟」。作者Narasimha Karumanchi寫這本書的目的,就是要把這兩樣東西,用最白話、最接地氣的方式講清楚。他發現,很多教程式的書,都把這部分講得太理論、太抽象,好像是在看火星文,讓很多想學好程式的人,直接從入門到放棄。 那為什麼這兩樣東西這麼重要?我們再用剛剛的例子想一下。如果你的食材(資料)全部亂堆,每次要找個東西,是不是都像在垃圾堆裡尋寶?這就是糟糕的資料結構。如果你的食譜(演算法)寫得亂七八糟,一下要你加鹽,一下又要你回頭去洗菜,那你做菜的效率肯定很差。在程式裡,這就代表著你的App會跑得非常慢,非常消耗手機或電腦的資源。 書裡提到一個很核心的概念,叫做「複雜度分析」,聽起來又是一個嚇人的名詞,但說穿了,它就是一個評估食譜好壞的標準。它主要看兩個東西:「時間複雜度」和「空間複雜度」。 「時間複雜度」,指的就是你這份食譜,要花多少時間才能完成。有些食譜,不管你做一人份還是十人份,步驟都差不多,那它的時間複雜度就很低,很有效率。但有些食譜,你多做一人份,就要多花一倍的時間,那它的時間複雜度就很高。 「空間複雜度」,指的就是你做這道菜,需要用到多少個盤子、碗,也就是佔用多少廚房空間。有些食譜很省空間,幾個碗就能搞定。有些食譜則是大陣仗,把整個流理台都佔滿了。 一個好的程式設計師,就像一個厲害的總鋪師,他會根據今天要做的菜(要解決的問題),去選擇最適合的食材整理方式(資料結構),並且設計出最有效率的烹飪步驟(演算法),同時考慮到時間和空間的成本。這就是本書想帶給我們的核心精神:不只是一個會寫程式的「碼農」,而是一個懂得思考、懂得優化的「軟體工匠」。學會了這些,你不只寫的程式能動,而且還能動得又快又好,這才是真正專業的表現,也是你拉開與其他人差距的關鍵所在。所以,準備好你的鍋鏟和圍裙,我們準備開始這趟精彩的程式料理之旅吧!

02排隊的藝術,直線的智慧

你有沒有在連假時去排過那種超有名的拉麵店?長長的人龍,一個接著一個,非常有秩序。或者,你有沒有坐過火車?第一節車廂、第二節車廂……一直到最後一節,每一節車廂都有編號,你可以很輕易地說出:「我在第五節車廂。」這些我們生活中常見的「排隊」場景,其實就是程式世界裡最基本、也最重要的兩種資料結構:「陣列(Array)」和「連結串列(Linked List)」。 我們先來聊聊「陣列」,它就像是火車車廂。有什麼特色呢?首先,每一節車廂都是「連續」的,你走過第一節,就一定會到第二節,中間不會突然跳到別的地方。再來,每一節車廂都有「編號」,也就是所謂的「索引」。當列車長廣播說:「請第五節車廂的旅客準備下車」,你可以馬上知道是哪一節,完全不用從頭開始找。這就是陣列最大的優點:「讀取速度快」。在程式裡,如果你把一堆資料放進陣列,電腦的記憶體就像是火車鐵軌,會幫你安排一塊「連續」的空間。只要你告訴電腦:「我要拿第100個資料」,它會立刻透過數學計算(地址 = 起始地址 + 索引 資料大小),「咻」一下就跳到那個位置,把資料拿給你。這速度,簡直比高鐵還快,我們在複雜度分析上會說它的讀取時間是O(1),意思就是「瞬間完成」。 聽起來很棒對吧?但火車車廂有什麼缺點?你想想看,如果在尖峰時刻,第三節和第四節車廂之間,突然想再加掛一節新的「親子車廂」,辦得到嗎?超難!你得先把後面的所有車廂都移開,騰出空間,再把新的車廂加進去,然後再把後面的車廂一個個接回來。這工程也太浩大了!同樣地,如果你想把第二節車廂拿掉,也是一樣麻煩,你得把後面的車廂全部往前移一格來補上空位。 這就是陣列最大的缺點:「新增和刪除資料很慢」。因為它要求所有東西都必須是連續的,所以任何「插隊」或「離隊」的行為,都會引發一連串的「大風吹」,非常沒有效率。就像是你在Excel表格裡,要在中間插入一列,整張表格下半部的資料都得往下移,資料一多,電腦就會轉圈圈給你看。所以,陣列適合用在那些「資料不太會變動,但需要經常快速讀取」的場景。例如,存放一整年365天的日曆資料,或是儲存一張圖片的像素資料,這些都很適合用陣列。 那如果我們的資料需要很頻繁地變動呢?像是排隊買珍珠奶茶,隨時有人會放棄不排了,也可能會有朋友來插隊。這時候,「連結串列」就登場了。 你可以把連結串列想像成去玩「大地遊戲」或「尋寶遊戲」。你拿到第一張線索卡(第一個資料),上面寫著:「寶藏的一部分在這裡,下一個線索在公園的溜滑梯下。」於是你跑到溜滑梯,又拿到一張線索卡,上面寫著:「下一個線索在便利商店的櫃檯。」就這樣一個接一個,直到你找到最後一個寶藏為止。 在連結串列裡,每個資料都像是一張線索卡,它包含兩個東西:一個是「資料本身」(寶藏的一部分),另一個是「指向下一個線索卡的指標」(下一個線索在哪裡)。這些線索卡(資料)在記憶體裡,並不需要像火車車廂一樣連續放好,它可以散落在各地,東一個西一個,反正只要靠著「指標」這個線索,就能把所有資料串起來。 這樣做有什麼好處?好處可大了!如果今天有人想插隊怎麼辦?簡單!假設你想插在A和B之間,你只要把A手上的線索卡,改成指向你,然後把你自己的線索卡,指向B。這樣就搞定了!原本A->B的隊伍,就變成了A->你->B。完全不需要移動後面所有的人。同樣地,如果有人想離隊,也只要把前一個人手上的線索,指向後一個人,跳過中間想離開的人,他就成功離隊了。 這就是連結串列最大的優點:「新增和刪除資料超快」。它的時間複雜度也是O(1),瞬間完成。但是,它的缺點是什麼?你想想看,如果尋寶遊戲的主辦單位突然問你:「請問第五個線索在哪裡?」你該怎麼辦?你沒辦法立刻回答,你只能從第一張線索卡開始,一個一個往下找,直到你數到第五個為止。這就是連結串列的致命傷:「讀取特定位置的資料很慢」。它的時間複雜度是O(n),n代表資料的總數,意思就是最壞的情況下,你可能要找遍整個隊伍才找得到。 所以,陣列和連結串列,就像是硬幣的兩面,各有優缺點,沒有誰絕對比較好,端看你的「應用場景」。這也是作者在書中不斷強調的觀念:一個好的工程師,不是去背誦哪個資料結構比較厲害,而是要去「理解」它們各自的特性,然後像個醫生一樣,針對不同的「病症」(需求),開出最適合的「藥方」(資料結構)。這就像是你去台北,如果只是要去隔壁巷口的7-11,你應該會走路去(簡單快速);但如果你要去高雄,你就會選擇搭高鐵(雖然票價貴但長途效率最高)。為不同的問題,選擇對的工具,這才是資料結構與演算法的精髓所在。

資料結構與演算法輕鬆學 book cover - Leapahead summary

使用 LeapAhead 應用程式繼續閱讀

完整摘要正在應用程式中等您

03. 後進先出?還是先進先出?

04. 資訊爆炸?靠「樹」神救援

05. 從捷運圖看懂人際關係網

06. 大海撈針?教你秒速找到它

07. 結語

關於 納拉辛哈.卡魯曼奇

納拉辛哈.卡魯曼奇(Narasimha Karumanchi)是電腦科學領域備受推崇的作者與專家,長期深耕於資料結構與演算法相關研究與教學。擁有豐富的軟體開發實務經驗,並創立 CareerMonk 出版社及 CareerMonk.com 職涯與面試準備平台,致力於協助工程師與資訊相關背景讀者強化專業能力,順利銜接職涯發展。

探索分類