數據結構是噩夢?想要通過面試,你必須掌握它

點擊上方 "程序員小樂"關注, 星標或置頂一起成長

每天凌晨00點00分, 第一時間與你相約


每日英文

No matter what happens to us in the future, everyday we are together is the greatest day of my life. I will always be yours.

無論未來何去何從,我們在一起的每一天都是我人生中最為輝煌的日子。


每日掏心話

每個人都有另一半,請不要把他的另一半逼出來。給他人留餘地,就是給自己攢人品。

來自:公眾號 讀芯術 | 責編:樂樂

數據結構是噩夢?想要通過面試,你必須掌握它

程序員小樂(ID:study_tech)第 847 次推文 圖源:unsplash


往日回顧:又一個程序員被判刑了!運維違規操作被判5年半,IT從業需要懂法律!


正文


就當是一場夢,醒了還是很悲痛,還是難以忘記被數據結構折磨的慘痛。當你打開一本數據結構和算法的教科書時,裡面總是充滿複雜的數學,令人望而生畏。對於那些不太喜歡這門學科的人來說,這就是一場噩夢。
然而現實是,想要通過編程面試,必須求解算法,這就離不開數據結構。別害怕,一旦瞭解了數據結構,就會發現它們其實沒有看上去那麼難了。
本文將會簡化和總結這些最基本的數據結構,幫你搞定數據結構。

數據結構是噩夢?想要通過面試,你必須掌握它

數據結構是一種在計算機中組織數據以便高效使用的特殊方式:
“在計算機科學中,數據結構是一種數據組織、管理和存儲的格式,其允許高效地訪問和修改。更準確地說,數據結構是數據值,數據值之間的關係,以及可應用於數據的函數或操作的集合。”
我們必須將數據存儲到某種數據結構中,選擇正確的數據結構至關重要。
數據結構是噩夢?想要通過面試,你必須掌握它
值得注意的是,數據結構沒有好壞之分,每種數據結構都有其優缺點。有很多方法可以用來衡量一種數據結構,這些也被稱為大O符號,這是衡量操作可伸縮性的一個指標。

現在來討論一下不同類型的數據結構。
數據結構是噩夢?想要通過面試,你必須掌握它
鏈表的單位被稱為“節點”,一個節點包含一個值和一個指針(Pointer)。值只是一個數字,如12,而指針將該值鏈接到鏈中的下一個節點。這就是鏈表的連接部分,鏈表中的第一個節點被稱為頭,最後一個沒有指針的節點被稱為尾。
數據結構是噩夢?想要通過面試,你必須掌握它

什麼是數據結構?數據結構是一種在計算機中組織數據以便高效使用的特殊方式:“在計算機科學中,數據結構是一種數據組織、管理和存儲的格式,其允許高效地訪問和修改。更準確地說,數據結構是數據值,數據值之間的關係,以及可應用於數據的函數或操作的集合。”我們必須將數據存儲到某種數據結構中,選擇正確的數據結構至關重要。圖源:unsplash值得注意的是,數據結構沒有好壞之分,每種數據結構都有其優缺點。有很多方法可以用來衡量一種數據結構,這些也被稱為大O符號,這是衡量操作可伸縮性的一個指標。現在來討論一下不同類型的數據結構。鏈表鏈表的單位被稱為“節點”,一個節點包含一個值和一個指針(Pointer)。值只是一個數字,如12,而指針將該值鏈接到鏈中的下一個節點。這就是鏈表的連接部分,鏈表中的第一個節點被稱為頭,最後一個沒有指針的節點被稱為尾。


優點:添加刪除節點很方便,只需要更改指針指向的地址即可。
缺點:不擅長檢索節點,儘管有索引或搜索功能。因為每個節點只知道相鄰節點的信息。


數據結構是噩夢?想要通過面試,你必須掌握它
哈希映射或哈希表,也是一種關鍵的數據結構。它類似於JavaScript中的對象和Python中的字典,在這種類型的數據結構中,用戶為散列表提供一個單詞或者鍵,它將檢索定義或值。
其工作原理很像一個數組,該鍵通過名為“散列函數(哈希函數)”的函數運行,該函數會找出鍵對應的內存地址。
不同之處在於,這些位置在內存中不需要相鄰,而是可以在任意位置。因此,大小的增加不會存在問題。

但是,存在一個不同問題——根據使用的散列函數,兩個鍵可能會指向同一個內存地址。這就是所謂的“衝突”,有很多種辦法可以解決這個問題,但是這一切都隱藏在函數內。
數據結構是噩夢?想要通過面試,你必須掌握它

散列表(哈希表)哈希映射或哈希表,也是一種關鍵的數據結構。它類似於JavaScript中的對象和Python中的字典,在這種類型的數據結構中,用戶為散列表提供一個單詞或者鍵,它將檢索定義或值。其工作原理很像一個數組,該鍵通過名為“散列函數(哈希函數)”的函數運行,該函數會找出鍵對應的內存地址。不同之處在於,這些位置在內存中不需要相鄰,而是可以在任意位置。因此,大小的增加不會存在問題。但是,存在一個不同問題——根據使用的散列函數,兩個鍵可能會指向同一個內存地址。這就是所謂的“衝突”,有很多種辦法可以解決這個問題,但是這一切都隱藏在函數內。


優點:正如已提及的,散列函數(哈希函數)非常適合添加和讀取。
缺點:可能會導致鍵值衝突。

數據結構是噩夢?想要通過面試,你必須掌握它
這兩種結構彼此非常相似,都是在數組的基礎上構建了一些附加功能。
棧是後進先出的數據結構。這類似於堆疊在一起的托盤,頂部的托盤在放入時是最後一個,在取出時是第一個。

將一個元素添加到棧頂稱為入棧,而從棧頂取出一個元素稱為出棧。每種語言都通過稱為調用堆棧的方式跟蹤已調用的函數。棧對於稱為深度優先搜索(DFS)的算法非常重要。
數據結構是噩夢?想要通過面試,你必須掌握它
另一方面,隊列是一種先進先出的結構,就像公共汽車站的排隊,最後一個排隊的人最後上車。在末尾添加元素的操作稱為入隊,從隊首刪除元素稱為出隊。隊列被用於稱為廣度優先搜索(BFS)的重要算法中。
數據結構是噩夢?想要通過面試,你必須掌握它

優點:兩種結構在添加和刪除元素時都非常有效。
缺點:與其他的數據結構相比,它們的用例數量有限。
數據結構是噩夢?想要通過面試,你必須掌握它
數組在所有的編程語言中都很常見,它是計算機內存中連續的單元塊。 下面的示例表示了一個具有12個元素的整數數組。數組的索引從0開始,因此包含12個元素的數組具有從0到11的索引。
數據結構是噩夢?想要通過面試,你必須掌握它

優點:數組擅於檢索項,但前提是數組較小。
缺點:隨著數組規模不斷增大,會佔用內存中的其他項來運行。因此,數組的添加操作效率很低,因為可能需要將數組移動到內存中的一個新位置以適應其長度。
幸運的是,這種情況出現在高級語言中,比如JavaScript和Python。若在底層語言中,必須要事先聲明數組的大小。 數據結構是噩夢?想要通過面試,你必須掌握它
數據結構是噩夢?想要通過面試,你必須掌握它

計算機語言中有一個專門的部分叫做“圖論”,圖類似於鏈表有著指向其它節點的節點,只是這些指針被稱為“邊”,邊可以有權重或者被賦予編號。
有一種特殊的層圖稱為“樹”,其中的數據向一個方向拓展。它們可以用於指代很多事物,例如“家譜”,或者用於表示網絡。與數組、鏈表、棧和隊列這樣的線性數據結構不同,樹是分層數據結構。
數據結構是噩夢?想要通過面試,你必須掌握它
優點:樹提供了高效的插入和搜索能力,而且樹的數據格式非常靈活,允許以最小的工作量來移動子樹。

缺點:缺點在於,修改列表和檢索的時間長度為O(log n)。 數據結構是噩夢?想要通過面試,你必須掌握它

入門算法求解離不開這些數據結構,關鍵在於不要畏難。搏一搏,噩夢變美夢。祝你早日掌數據結構。
數據結構是噩夢?想要通過面試,你必須掌握它

棧和隊列這兩種結構彼此非常相似,都是在數組的基礎上構建了一些附加功能。棧是後進先出的數據結構。這類似於堆疊在一起的托盤,頂部的托盤在放入時是最後一個,在取出時是第一個。將一個元素添加到棧頂稱為入棧,而從棧頂取出一個元素稱為出棧。每種語言都通過稱為調用堆棧的方式跟蹤已調用的函數。棧對於稱為深度優先搜索(DFS)的算法非常重要。另一方面,隊列是一種先進先出的結構,就像公共汽車站的排隊,最後一個排隊的人最後上車。在末尾添加元素的操作稱為入隊,從隊首刪除元素稱為出隊。隊列被用於稱為廣度優先搜索(BFS)的重要算法中。優點:兩種結構在添加和刪除元素時都非常有效。缺點:與其他的數據結構相比,它們的用例數量有限。數組數組在所有的編程語言中都很常見,它是計算機內存中連續的單元塊。 下面的示例表示了一個具有12個元素的整數數組。數組的索引從0開始,因此包含12個元素的數組具有從0到11的索引。圖源:BeginnersBook優點:數組擅於檢索項,但前提是數組較小。缺點:隨著數組規模不斷增大,會佔用內存中的其他項來運行。因此,數組的添加操作效率很低,因為可能需要將數組移動到內存中的一個新位置以適應其長度。幸運的是,這種情況出現在高級語言中,比如JavaScript和Python。若在底層語言中,必須要事先聲明數組的大小。圖源:unsplash圖和樹計算機語言中有一個專門的部分叫做“圖論”,圖類似於鏈表有著指向其它節點的節點,只是這些指針被稱為“邊”,邊可以有權重或者被賦予編號。有一種特殊的層圖稱為“樹”,其中的數據向一個方向拓展。它們可以用於指代很多事物,例如“家譜”,或者用於表示網絡。與數組、鏈表、棧和隊列這樣的線性數據結構不同,樹是分層數據結構。優點:樹提供了高效的插入和搜索能力,而且樹的數據格式非常靈活,允許以最小的工作量來移動子樹。缺點:缺點在於,修改列表和檢索的時間長度為O(log n)。圖源:unsplash入門算法求解離不開這些數據結構,關鍵在於不要畏難。搏一搏,噩夢變美夢。祝你早日掌數據結構。

歡迎在留言區留下你的觀點,一起討論提高。如果今天的文章讓你有新的啟發,學習能力的提升上有新的認識,歡迎轉發分享給更多人。


猜你還想看


阿里、騰訊、百度、華為、京東最新面試題彙集

徹底搞懂MySQL分區,看這篇就對了!

一個基於 Spring Boot 的項目骨架

記一次 JAVA 的內存洩露分析

關注訂閱號「程序員小樂」,收看更多精彩內容
嘿,你在看嗎?


分享到:


相關文章: