邏輯結構?存儲結構?傻傻分不清……

對於數據結構與算法的學習,我相信不管是新手還是老手,都會對“邏輯結構、存儲結構”產生很多的疑問。你可能覺得不就是兩個簡單的概念嘛,早就瞭然於胸了。

Wait!

2rGp3S

先不要急着下定論,我們還是先來看一道題目。實踐是檢驗真理的唯一標準嘛!(萌新略過)

  • 例題1

3xoodT

選哪個呢?是不是很糾結?有答案了沒?

別急,我們再來看一道題。

  • 例題2

TVmcFc

如果這兩道題你覺得very easy,那麼接下來的內容,恭喜你,不必再看了;如果仍然覺得哪裏有問題,以及不敢確定自己的答案,還是來跟着我過一遍知識吧,在閱讀的過程中,思考上面的兩個問題。

注:以上例題來源於王道:《數據結構與算法》

邏輯結構:我不要你覺得

你應該知道,數據結構的三要素是:邏輯結構、存儲結構、數據運算。

首先我們來回答一個問題:什麼是邏輯結構呢?

從定義的角度來說,所謂邏輯結構,指的就是數據之間的邏輯關係,從邏輯關係上來描述數據。邏輯結構又包括線性結構和非線性結構兩種,線性表是一種典型的線性結構,圖是一種典型的非線性結構,特別注意:邏輯結構與存儲結構無關。

看了定義是不是覺得非常混亂?

那麼,你覺得什麼是邏輯上的關係呢?我們來思考這個問題:”順序表是邏輯結構嗎?“

如果你認爲,”線性表是一種線性結構,順序表是屬於線性表的,所以,順序表應該是一種邏輯結構。“

很不幸,這種想法是非常錯誤的!!!

BQK9hl

所以,我們在判斷邏輯關係的時候,不要想當然,不要你覺得,應該理性判斷。

我們可以認爲邏輯結構是一種”依賴關係“,描述的僅僅是數據元素之間的關係,除了描述數據元素之間的關係外,再也沒有其他的含義了

比如,我們回顧剛剛的問題,”順序表是邏輯結構嗎?“

答案:不是。雖然順序表是一種線性結構,但是你要注意,順序表背後包含着”順序存儲的意思“。也就是說,順序表既能夠描述邏輯結構,也能夠描述物理結構。所以,這是一種混合類型。

再來,”有序表是邏輯結構嗎?“

顯然,是的。有序表指的是數據元素按照一定順序排列的線性表,除了描述“兩個元素之間有序”的依賴關係以外,它再也沒有別的意思了。

所以,你是不是能夠體會到邏輯結構的獨特之處了?

Ks6aJg

總結一下,邏輯結構指的就是數據元素之間的關係,這種關係可以是如下的幾種:

  • 沒有關係:一個集合,裏面的元素除了同屬一個集合以外,沒有其他任何關係。很明顯,這是一種非線性的關係。
  • 一對一:線性結構。線性結構中的元素都是一對一的。你可以簡單的把它理解爲一個串,僅有一個開端和一個結尾結點,並且除了開端和結尾外,每個結點只能有一個前驅結點和一個後繼結點。比如字符串,如圖所示:

WJse0V

  • 一對多:圖或者樹就是兩種典型的一對多的非線性關係。從圖中可以看到,非線性結構的樹和圖中的結點除了第一個結點和最後一個結點以外,其餘結點能夠有一個或者多個前驅和後繼。

qro9Uz

最後,如果讓你判斷一個名詞是否爲邏輯結構,我們應該怎麼做?可以考慮以下幾點:

  • 首先,判斷名詞是屬於線性結構還是非線性結構

  • 其次,由於數據的邏輯結構是獨立於存儲結構的,所以考慮名詞背後是否暗含存儲結構?如:順序表。(別急,關於存儲結構,我們馬上就講)如果暗含存儲結構,那麼一定不是邏輯結構。

存儲結構:我要我覺得

存儲結構就非常好理解了,存儲結構,也被稱作是物理結構,表述的是含有某種邏輯關係的元素在計算機中存儲的方式。可以理解爲數據元素在存儲器上的排列方式。

總的來說,存儲結構只有四種,分別是順序存儲、鏈式存儲、索引存儲、散列存儲(哈希存儲)。

  1. 順序存儲:所謂順序存儲,就是把邏輯上相鄰的數據元素,存儲到計算機的存儲器上時,在物理上也是相鄰的。最簡單的實現就是數組,我們可以直接把一列元素存儲在數組中。顯然,這種實現存儲的方式優點是:能夠實現隨機存取,即通過數組的下標,我們能夠很輕鬆的找到數據元素獲取或者修改它。

  2. 鏈式存儲:鏈式存儲,就是我們所熟知的鏈表。我們無需像順序存儲那樣,單獨開闢一片連續的存儲空間,只需要用到的時候直接分配空間,用指針來實現整個一對一邏輯結構的實現。這樣子做雖然節省了空間、動態擴容,但是問題也很明顯:當你想找到編號爲n的元素,只能從表頭開始遍歷。

uB0G8b

  1. 索引存儲:這種存儲方式類似於我們的書和目錄的關係。比如書中”第五章“的內容在35頁,我們想要找到它,只需要瀏覽目錄,然後通過頁碼找到相關的內容。一般存儲的時候都是【關鍵字,地址】這種形式。

  2. 散列存儲:對於散列存儲,我們可以設想這樣一個場景。博主我買了一套房子(買不起的,別想了.jpg),本來買的時候選中了0322這間,但是由於施工問題,整棟樓是從0000開始編號的(買的時候是按照0001編號),這樣就造成了一個問題,現在的0322號已經不是我的了,我的是0321。就是原來的房間號減去1。所以,散列存儲實際上就是做了一個函數關係的映射,由x去找y,如果y=x+1,那麼x=1的元素就應該去y=2位置尋找。這樣理解起來應該沒有困難了吧。

l8Gh94

回過頭來,我們看文章開頭的第二個問題:

A選項,循環隊列,實際上是用數組實現的,也就是順序存儲;B選項,鏈表,很明顯,這是一種鏈式存儲;C選項,哈希表,這已經是明示了——哈希存儲;最後一個,棧是一種很重要的邏輯結構,既能夠用順序存儲實現也能夠由鏈式存儲實現。所以,答案就是D。

存儲結構的核心是:只有這四種,我要我覺得,再也沒有其他的可能了。

最後

以上就是文章的所有內容了。如果你仍有疑問,歡迎隨時留言,或者後臺@我。

如果你喜歡我的文章,歡迎關注我的微信公衆號:最高權限比特流

公號專注”計算機專業大學生成長,在這裏,希望你能夠收穫知識,能夠體悟程序人生。“

雖然我們此刻仍然弱小,但希望我們能夠一路前行,一起成長!

”願你走出半生,歸來仍是少年。“

公衆號

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