作爲一個程序員,數據結構與算法的這個知識點必須懂!

編碼之外寄語:當你有了足夠的物質和內涵做基礎,你的人生會變得底氣十足,記住,越努力越幸運!關注編碼之外,跟隨慶哥一起進階!

這篇文章會讓你學到什麼?我們在學習數據結構與算法之前,普遍會覺得難度比較大,這是因爲數據結構和算法這玩意,本身難度就大而且還抽象,而且很多書上說的和老師講的,也許都對,但是就是過於官方化,不利於我們理解學習,我們需要的是大白話的講解,需要的是我們真正能夠聽得懂的,而且還有許許多多的概念性知識,很重要,但是很多時候都被一筆帶過了。

比如今天要學習的關於數據的邏輯結構和物理結構,雖說是個簡單的概念性知識點,但是我覺得很多人是迷糊的,不信的話,回答一下,啥是數據的邏輯結構和物理結構啊?😁

你可知數據的邏輯結構和物理結構

慶哥: 小白啊,你可知道什麼是數據的物理結構和邏輯結構?

小白: 啥?之前聽你講了什麼是數據結構,現在明白了,但是啥是數據的物理結構和邏輯結構啊,不太清楚😂

慶哥: 這個不知道可以理解,因爲我覺得吧,應該有很大一部分人不太清楚這個概念的,包括我之前,似乎就沒有注意過這個,就知道學習數據結構,頂多會去探討啥是數據結構,而關於數據的邏輯結構和物理結構還真的瞭解不多。

小白: 這個概念很重要嗎?

慶哥: 在之前不瞭解的時候覺得就是一個概念性的知識,現在深入瞭解之後,發現對更好的學習數據結構很有幫助,尤其是在這個理解層面上😁

小白: 那慶哥趕緊給我講講吧,迫不及待的想要學習了

慶哥: 好的,今天我就給你說道說道這個數據的邏輯結構和物理結構,小白啊,你覺得數據結構是啥?我們之前可是講解過的

小白: 數據結構簡單來說就是一門研究數據如何存儲的學科,再往具體的說,數據結構就是一堆數據的集合,這些數據之間存在着某種特定的結構,而這個結構指的就是數據之間的關係

如何選擇合適的數據結構

慶哥: 可以啊,說的不錯,你也說了,數據結構的一個重要作用,就是研究數據該如何存儲,我們之前也學習了各種數據結構,比如數組啊,鏈表啊,棧和隊列什麼玩意的,那你有沒有想過,我們如果要存儲一些數據的時候該選擇哪種數據結構呢?

小白: 我猜這一定有一些選擇標準吧😂

慶哥: 確實的,不同的數據結構各有千秋,我們在選擇數據結構的時候也要考慮一下該選擇什麼樣的數據結構,以此來發揮數據結構的最大作用,比如我們都知道數組這種數據結構插入刪除操作需要做數據的移動(其實這裏是對數據做複製的操作),這樣的操作就很費時間了,而鏈表嘞,插入刪除就很簡單,但是鏈表的遍歷則不咋滴,這些都是受到數據結構本身的結構影響。

所以啊,我們在存儲數據的時候是要選擇合適的數據結構,那麼該怎麼選擇呢?這裏有兩個選擇標準:

  1. 數據的邏輯結構
  2. 數據的物理結構

小白: 來啦來啦,終於要說到他倆了😂

你可知數據結構的存儲結構/方式

慶哥: 彆着急,我們在說什麼是數據的邏輯結構和物理結構之前,我們必須先搞清楚**什麼是數據結構的存儲結構或者說是存儲方式?**怎麼樣,這個能夠回答的上來嗎?

小白: 啥?這怎麼又出來一個數據結構的存儲方式啊,這個有點懵啊,之前好像沒有接觸過嘞

慶哥: 有這麼一句話不知道你有沒有聽過:

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

咋樣?聽過嗎?理解嗎?

小白: 這個還真是第一次聽說,爲啥只有兩種啊,數組和鏈表,這裏說的不就是數據結構嗎?那不是還有棧和隊列這些數據結構嗎😂

慶哥: 是的,一般看大這樣說,都會以後還有其他數據結構啊,怎麼會只有兩種嘞,其實吧,在我逐漸學習數據結構的過程中,我就知道了這麼一回事:

在數據結構中,數組和鏈表可以說是數據結構中的數據結構,啥意思嘞,就是說啊,數組和鏈表可以說是基礎,其他的數據結構都可以在此基礎之上建立,就比如棧和隊列,他們也是一種數據結構,但是他們倆的實現可以用數組,也可以用鏈表,也就是說啊,棧和隊列的底層不是數組就是鏈表

咋樣,能明白咋回事不?

小白: 原來是這樣啊,數組和鏈表可以用來實現其他數據結構啊😁

慶哥: 對的,其實就是這麼回事,因爲數組和鏈表好像就是最簡單直白原始的結構了,所以可以以他們爲基礎去實現其他數據結構,數組實現的就叫做順序實現,鏈表的話就叫做鏈式實現,這些概念在以後的學習中也會不斷的接觸的。

小白: 嗯嗯,慶哥,我這裏還有個疑問啊,這個數據結構的存儲結構和存儲形式指的是一樣的嗎?

慶哥: 這個問題啊,我發現啊,在學習中經常會碰到這樣的形近詞,感覺總讓人摸不住頭腦,那麼這裏的存儲結構和存儲形似是否指的是一樣的呢?我們來看這句話:

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

看到括號了吧,數組對應順序存儲,鏈表對應鏈式存儲,所以啊,我們一般來說,數據結構的存儲結構和存儲方式都是指的這兩種,即數組的順序存儲和鏈表的連式存儲,如果非得分清的話,如果問的是數據結構的存儲結構,那說數組和鏈表合適點,如果問存儲形式,那回答順序存儲和鏈式存儲比較合適。

總的來說吧,無論是存儲結構還是存儲方式,說成這樣更爲合適,即:

數組爲主的順序存儲和鏈表爲主的鏈式存儲

其實吧,無論是存儲結構還是存儲方式,亦或是形式什麼的,都是這麼回事。然後你還應該記得:

好多數據結構既可以用數組實現也可以使用鏈表實現,數組實現的就是順序實現,鏈表實現的就是鏈式實現

咋樣?還ok不?

小白: 可以啊,這裏的信息量很大,get到了😂

搞定數據的邏輯結構和物理結構

慶哥: 接下來我們就來搞定數據的邏輯結構和物理結構吧,在理解了數據結構的存儲結構之後,我們再來看數據的邏輯結構和物理結構就比較簡單了。

我們上面也說了,對於數據的存儲該選擇什麼樣的數據結構,那就要取決於數據的邏輯結構和物理結構。

邏輯結構

首先我們就要判斷數據的邏輯結構,記住這是爲了確定選用什麼數據結構。

那啥是數據的邏輯結構嘞?其實很簡單,所謂數據的邏輯結構指的就是數據之間具有什麼樣的關係,一般如下:

  1. 一對一(採用線性數據結構存儲)
  2. 一對多(採用樹結構存儲)
  3. 多對多(採用圖結構存儲)

這個簡單吧,數據的關係一般是比價好判斷的,比如我們要存儲一個公司的人員架構情況,像這樣的數據,一般我們不僅要存儲數據還是存儲數據之間的關係,比如,一個經理管理好幾個小組,這就是一對多的關係,我們應該選擇樹結構來存儲,比如二叉樹。

小白: 這個邏輯結構還挺好理解的,那啥是數據的邏輯結構呢?

物理結構

慶哥: 這個物理結構啊,理解起來就比邏輯結構難上那麼一丟丟😁(但是得好好理解,不然容易迷糊),那啥是數據的物理結構呢?

物理結構說起來是比較簡單的,就是指的數據在內存中的存儲形式,一般有如下兩種:

  1. 集中存放
  2. 分散存儲

咋樣,這個好理解吧?

小白: 嗯嗯,這個理解起來沒啥問題,內存就相當於一個房子似的沒有空間,集中存放相當於人們在這個房子裏都站在一塊,扎堆😂,分散存儲就相當於站的哪都有,沒有擠到一塊😁

慶哥: 可以啊,你這個比喻不賴,很形象啊。

小白: 😁,但是還有問題啊,我們該如何判斷數據是那種存儲形式呢?

慶哥: 是的,我們僅僅知道了啥是數據的物理結構,這裏有兩種,我們如何判斷出我們存儲的數據是哪種呢?同樣的這裏看兩個指標:

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

說這個之前你還得明白一個重要的知識點,你看啊,我們說的這兩種物理結構,集中存放和分散存儲,跟啥有點像?

小白: 這個不就和數據結構的存儲形式有點像嘛

慶哥: 完全正確,你看啊,數據結構的存儲方式就是數組爲主的順序存儲和鏈表爲主的鏈式存儲,不就一一對應集中存放和分散存儲嘛?

另外要知道,我們確定了數據的邏輯結構之後就確定要用什麼數據結構了,但是這個數據結構要如何存儲呢?是選擇順序存儲還是鏈式存儲呢?這個就要靠我們現在說的數據的物理結構來決定,而要決定數據的物理結構,又要看如下兩個指標:

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

這裏有點繞,千萬不要迷糊,仔細看幾遍。然後我們接着說內存的空間狀態和數據的用途。

啥意思嘞?我們拿內存空間的狀態來說,首先啊,我們得知道,集中存放要求有連續的內存空間,比如我們要存儲10M大小的數據,那就是要求內存中也要有一整塊空間是10M,但是如果沒有的話那肯定不能集中存放了,但是數據終歸還是得存放啊,那隻能分散存儲,否則存儲不成功啊。

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

總結

所以我們根據內存的空間狀態和數據的用途來確定數據的物理結構是集中存放還是分散存儲,然後再選擇對應數據結構的存儲方式,也就是:

  • 物理結構爲集中存放就選擇數組爲主的順序存儲
  • 物理結構爲分散存儲就選擇鏈表爲主的鏈式存儲

另外說一點就是,我們在分析某一個數據結構的時候,默認前提就是確定了數據的邏輯結構,只需要分析數據的物理結構,目的就是確認數據結構的存儲形式,看看這個數據解僱是該選擇數組爲主的順序存儲還是鏈表爲主的鏈式存儲。

小白: 哇塞,今天真的是get到了,不過感覺都是概念性的東西,很多名詞長得還是那麼像,真的很容易迷糊啊😂

慶哥: 哈哈,正常正常,建議多看幾遍,好好理解理解,對學習數據結構和算法非常有幫助的。

小白: 不說了,我要再看一遍去……

大家加油!😎

更多幹貨

歡迎大家閱讀我的文章,我是一名Java自學者,開了一個公衆號【編碼之外】,專注於大白話講解數據結構與算法,同時說點對程序員有用的(高效學習方法和經驗,工作學習感悟以及和黑科技網站和高效率工具等),並且把原創文章都整理成PDF,微信搜“編碼之外”,關注回覆“PDF”即可獲得,加我微信:H653836923,編碼之外,一起進階!

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