輕鬆學習八大類型數據結構,在項目中使用數據結構遊刃有餘

應該有不少夥伴都學過數據結構吧?

這數據結構真的搞得我頭大,這都是啥啊

不怕你笑話,我在大學四年都搞不懂數據結構,這是個什麼東西?我真的那麼蠢嗎?非常尷尬)


當我在大學的時候,我總覺得這件事太抽象了,無法理解。我越學就越跟不上,學到一半就掉隊了。基本上就是屬於放棄治療了。後來我知道這本書中寫的是偽代碼。我說怎麼能把我看得一楞一楞的?就這樣,在大學四年的時間裡,我愣是沒有搞懂數據結構.

然後嘞,那些搞懂的,順利參加校招,拿到滿意offer,進入大廠,迎娶白富美……而我呢?

面試官:“數據結構有了解嗎?”

我:“啥?你說啥?數據結構是個啥?”

然後我就順利畢業了……

扎心不,老鐵?你是不是也是這樣啊,正在讀大學,數據結構也是一臉懵逼,或者畢業了,還是不知道數據結構到底是個啥,說出去怪尷尬,沒事,看了今天這篇文章,保準你可以出去大聲喊“我……終於……知道……數據結構是個啥啦”(拉長音……)

數據結構是個啥玩意啊?

當我第一次接觸“數據結構”時,我覺得它有點抽象,但我不認為它很難理解。嗯,應該是這樣的。誰知道,我學得越多,就越糊塗。讓我們看看這個數據結構是如何定義的:

數據結構是相互之間存在一種或多種特定關係的數據元素的集合,換句話說,數據結構是帶“結構”的數據元素的集合,“結構”就是指數據元素之間存在的關係。

我不知道你看到這個定義時的感受。但我當時是有點困惑,現在的我看著這個定義,

蠻好的


聊聊數據在計算機中的存儲

為了更好地理解數據結構,你需要首先了解計算機中數據的存儲。舉個簡單的例子。例如,我們需要存儲一個數字,比如1024。如何儲存?我們知道代碼(Java)通常是這樣寫的:

int a = 1024;

那就是定義一個整型。寫完後,它就保存在我們的電腦上。事實上市保存在我們電腦的硬盤上。只有當程序加載到內存中時,它才能被CPU讀取和運行。所以,這個1024實際上需要加載到內存中。這裡我們需要注意的是,這個1024是我們編寫的程序中的一個整型變量。你需要明白的是,我們說它保存在內存中,是因為我們想運行這個程序。

一旦運行此程序,此程序中包含的數據將加載到內存中,就像這裡的1024一樣被保存到內存中。怎麼怎麼保存呢?這裡你還要記住這麼一句話:

計算機中的數據都是以二進制的形式保存的

因此嘞,這個1024是十進制,要轉換成二進制保存在內存中,內存有一定的大小,你要保存一個整數,你是不是得佔用內存的一些空間啊,假如是這樣:


輕鬆學習八大類型數據結構,在項目中使用數據結構遊刃有餘

你看,這樣這個1024就被存在了內存中,當然,你得明白,這個1024其實被轉換成了二進制形式,我這樣只是為了便於表示說明。

再來說數據結構

在我們瞭解了數據是如何存儲在計算機中之後,我們可以再來看看數據結構。定義我們之前看過了,怎麼去理解嘞。顧名思義,數據結構就是數據和結構。結構可以理解為關係,即數據之間的關係

這樣說還是有點困惑?你可以這樣理解。首先,你應該知道數據結構。它是一門學科。這是幹什麼的?說白了,就是研究數據該怎麼存儲?

你可能說了,還研究怎麼存儲,難道存儲不都是一樣的嗎,雖然這個問題有點chun,但是嘞,確實是個讓小白疑惑的問題,數據的存儲當然是不同的。例如,如果我們要存儲五個整數{1、2、3、4、5},那麼如何將它們存儲在內存中

可能是這樣

在內存中是排成一排的,一個挨著一個,

輕鬆學習八大類型數據結構,在項目中使用數據結構遊刃有餘

也有可能是這樣!!!


輕鬆學習八大類型數據結構,在項目中使用數據結構遊刃有餘

就是在內存中沒啥順序,零散的存放,所以啊你看,對於數據,可以按照不同的方式去存儲,是給你連續挨著存放,還是存放在哪就存放在哪啊,你可能要問啦,哪這咋整,這個嘛,就得看數據本身以及其他相關要求,看看你這個數據以後準備怎麼用,然後考慮怎麼存放比較合適。

所以啊,數據結構啊,就是來管理數據在內存中的存儲的,比如,有一些數據要在內存總存儲,那就得看數據結構,數據結構讓你怎麼存放你就得怎麼存放,讓你連續存放,你就不能撒花似的哪都是的。

另外啊,你還需要知道,這裡的數據結構是個統稱,就好比水果,它有香蕉蘋果和橘子,數據結構也是一樣啊,它是個總稱,有數組,鏈表,棧和隊列等等,這些都屬於數據結構,就好比,香蕉蘋果和橘子都是水果,這個好理解吧!

然後嘞,這些數據結構啊,每個都有它們自己的一些特點,這些特點就是規定如果數據選擇了它這種數據結構來存儲,就要按照它的要求在內存中存放,比如你選擇了數組,那麼你這些數據就要在內存中連續存儲,一個挨著一個,不能亂,而如果你選擇了鏈表這種存儲結構,那在內存中就不要求你非得連續存儲,隨意,有空地你就可以存儲。

所以你看,不同的數據結構有它特定的用途……

到了這裡,你差不多就理解了數據結構是個啥了吧,也就是說啊,數據結構就是研究數據怎麼存儲嘞,然後數據結構是個總稱,好比水果,其下有數組,鏈表,棧和隊列這些數據結構,好比水果有香蕉蘋果和橘子,其實嘞,你就可以把數據結構想象成一個容器,容器是幹啥的嘞,盛東西的啊,這裡就是存儲數據的,而這些容器形狀各異,你選擇了不同的容器(數據結構),那麼就意味著數據的存儲形式是不同的。

說了這麼多,就這些嗎?當然不是。我們可以想象,我們上面提到的五個數據之間是沒有聯繫的。最多,當數據連續存儲時,它們彼此相鄰。這樣,就形成了一對一的關係,就像排隊一樣。我在你前面,你在我後面。

但還有另一種數據。比如我們要存儲一個家譜中的數據信息,比如這樣:


輕鬆學習八大類型數據結構,在項目中使用數據結構遊刃有餘

你怎麼把這些數據存儲到內存中呢?這些不同於那些冷冰冰的數字。把它們保存在內存中就萬事大吉了。當我們保存這種家譜數據時,我們實際上不僅保存了數據,而且保存了數據之間的關係。

經過以上的介紹,你一定了解個大概了。然後只需要選擇一個合適得數據結構來存儲它,說的不錯。我們可以分析家譜數據,發現這些數據有一對多的關係。例如,爺爺有三個兒子,叔叔有兩個孩子。數據結構中有一個名為tree(數) 的結構,可以存儲此類數據。

上面提到的一對一和一對多都是表示數據之間的關係,其實就是數據結構中的結構。有人可能會問,有多對多的關係嗎?答案一定是有的,那麼這種關係如何儲存呢?沒關係。數據結構中還有一個叫做圖德數據結構,就是專門針對多對多的數據的。

所以你看,數據結構是個啥,不就是管著數據該怎麼存儲嘛?

數據結構都有哪些嘞?

那麼,你肯定好奇,那麼,數據結構都有哪些啊?數據結構總的來說有如下三大類:

  • 線性表,也就是數組、鏈表、棧和隊列;
  • 樹結構,包括普通樹,二叉樹,紅黑樹等等;
  • 圖存儲結構,這玩意有點難;

接下來我對這些數據結構做一下簡單的介紹。

  • 線性表
  • 樹結構
  • 圖結構
  • 等等

在我的專欄有詳細介紹,我就不多說了

實際上,對於數據的存儲該選擇什麼樣的數據結構,那就要取決於數據的邏輯結構和物理結構,再次聲明下,這點的理解很重要,以下我說的每個字都不要漏掉哦

啥是邏輯結構?

不知道你們之前有沒有想過這個問題,數據的邏輯結構是個啥?可能你有點迷糊,但是說起來真的很簡單:

數據的邏輯結構就是指的數據之間存在的關係

我想經過上面的講解,你這裡立馬就知道,這裡指的關係就是上面說的什麼一對一,一對多和多對多了,不錯,就是這些,這裡的數據的邏輯結構指的就是這麼些個關係,就好比我上面給的那個圖,我們再來看一下:

我想經過以上的解釋,你會馬上知道這裡的關係是指一對一,一對多,多對多。不錯,就是這些。這裡的數據的邏輯結構指的就是這些關係,就像我上面給出的圖一樣。我們再來看看:


輕鬆學習八大類型數據結構,在項目中使用數據結構遊刃有餘

例如,上圖中的大伯,二伯和爸爸,他們都屬於兄弟關係。爺爺有三個兒子,大伯有兩個孩子,這種都是一對多的關係。如果要這樣存儲數據,不僅要存儲基本的數據信息,還要存儲它們之間現有的關係。

而這種關係即是數據之間的邏輯結構。

總之,數據之間的邏輯結構大致可以分為三種類型,即:

  • 一對一:就是那種你挨著我,我挨著你的數據,比如數組
  • 一對多:就是我們上面畫的家譜圖那樣
  • 多對多:這個比如說地圖,或者一些四通八達的路,能明白我的意思吧
  • 其實吧,給到你一些數據,你基本上都能判斷出這些數據是什麼關係,也就是說,數據的邏輯結構不難辨認。

    到了這裡,你有沒有發現,這三種邏輯結構的數據,正好可以用我們上面介紹的三大類的數據結構去存儲,想一下,也就是下面三種:

    1. 線性表:一對一
    2. 樹結構:一對多
    3. 圖結構:多對多

    有沒有發現,萬變不離其中啊,只是我們瞭解了邏輯結構這個知識點後,你會覺得這塊的只是更加的完整。

    物理結構是什麼?

    我們在上面知道了邏輯結構是什麼,所以我們可以分析數據之間的邏輯結構,看看應該使用哪個數據結構來存儲數據。這看似已經萬事大吉,沒啥事了,但是,實則不然,其實吧,說到這裡,牽涉到的知識點又不少,我這裡只給你說重點,詳細的以後單獨拿出來嘮叨嘮叨。

    請先記住非常重要的一句話:

    數據結構的存儲方式只有兩種:數組(順序存儲)和鏈表(鏈式存儲)

    啥意思嘞?其實吧,數組和鏈表是數據結構中的數據結構,其他的數據結構都可以用數組和鏈表來實現,你比如拿棧來說吧,可以用數組來實現棧,這就叫做順序棧,也可以用鏈表來實現棧這個就叫做鏈式棧。

    所以啊,每種數據結構的存儲其實都可以分為順序存儲(用數組實現)和鏈式存儲(用鏈表實現)

    你比如說要使用隊列這個數據結構來存儲數據,那實際上,就可以分為順序隊列實現和鏈式隊列實現,也就是看你實際內存中怎樣去存儲這些數據,因此,你可以看出,數組和鏈表是數據結構中的基石啊!

    那麼,新的問題就來了,既然對於每個數據結構都可以有順序存儲和鏈式存儲,那麼即時我依據數據的邏輯結構選擇了一個數據結構,那麼我怎麼來確定是要順序存儲還是要鏈式存儲呢?

    這個問題的關鍵所在就是要分析數據的物理結構了?

    數據的物理結構是什麼?如果你以前沒有想過這個問題,你會感到困惑,但也很簡單:

    數據的物理結構就是指的數據在內存中的存儲是連續存儲,也就是集中在一塊的意思,還是零散的分散存儲。

    也就是說,對於一些數據,我們可以分析它們之間的邏輯結構,知道數據之間有什麼樣的關係。我們可以確定使用什麼樣的數據結構,但也需要分析數據的物理結構。

    可是,你有沒有發現問題,我們怎麼知道數據的物理結構是啥呢?

    這裡要看兩點,來讓我們決定數據的物理結構,分別是:

    1. 內存的空間狀態
    2. 數據的用途

    什麼意思?以內存空間的狀態為例。首先,我們需要知道,連續存儲需要連續的內存空間。例如,如果我們想存儲10m大小的數據,也就需要10m的連續的內存空間,但是如果沒有的話那肯定是用不了連續存儲了,那隻能分散存儲,否則存儲不成功啊。

    然後看看數據的用途。連續存儲和分散存儲的主要區別之一是,它會影響後續的數據操作。對於連續存儲,它具有很高的數據遍歷效率。因此,如果你存儲的這些數據後續的操作中遍歷比較頻繁,那肯定優先選擇連續存儲,當然,如果你後續的數據操作中會進行比較多的更新操作的話,那就優先選擇分散存儲了,因為它效率更高。

    所以我們根據內存的空間狀態

    數據的用途來確定數據的物理結構是連續存儲還是分散存儲,然後再選擇對應的存儲方式,也就是:

    1. 物理結構為連續存儲就選擇順序存儲
    2. 物理結構為分散存儲就選擇鏈式存儲

    更詳細的其他數據結構,查看其他章節



    分享到:


    相關文章: