算法筆記 (六)數據結構之線性表如何理解

線性表的理解?

     線性表從字面上的理解是線性的表示結構,生活中有很多類似於線性的例子,比如人們在買東西或等其它事情的時候經常排成一個線性結構,可以是直線也可以是曲線,線性表從字面上面的意思理解爲成一條直線的表,對於程序設計人我們最熟悉的莫過於關係型數據庫如mysql等,它裏面也有表的概念,我們可以對比着來理解線性表。

定義

     零個或多個元素的有限序列。

     從定義中可以知道線性表具有有限個元素,元素個數可知的元素組成,並且元素之間的關係符合線性,如兩個元素之間具有先後順序,除了第一個和最後一個元素,每個元素前後都有銜接元素,叫做直接前驅和直接後繼。第一個元素沒有前驅,最後一個元素沒有後續。可以參考下面表格來理解線性表結構:

數據 數據庫
數據對象
數據元素
數據項 字段

理解誤區:

     線性表的每個數據元素只保存了一個數據,其實它每個數據元素還可以分爲多個數據項,同上面的對標,一個數據元素可以理解爲數據庫表中一條記錄,每個數據元素還有很多數據項組成,如學生信息,包含學號、姓名、性別、出生年月等

存儲結構

順序存儲

指用一段連續的存儲單元來依次存儲線性表的數據元素。

如下面所示,用數學符號來表示元素的線性關係

這裏寫圖片描述

     由於順序存儲結構是連續的很顯然我們可以通過數組來存儲,它裏面保存的數據類型相同,我們只要知道了數組元素的起始地址即可以通過內容地址計算方法算出每一個後面元素的地址,因此在訪問數組中各個元素時時間複雜度都是O(1),即在常數範圍內。
- 讀取

     知道了第一個元素位置,可以容易計算出來每個數據元素地址,因此時間複雜度爲O(1),如下圖

這裏寫圖片描述

  • 插入、刪除
         對於順序存儲結構來說,如果想要插入或者刪除一個元素時,首先需要找到該元素複雜度爲O(1),插入或刪除完成後,後面的節點需要依次往前移動一個單位,最壞的情況插入或者刪除首個字符,那麼需要移動n-1次才能完成操作,即複雜度爲O(1).
    如下圖所示:

這裏寫圖片描述

鏈式存儲

     每個節點在計算機磁盤上不一定連續,由數據域和指針域組成,指針指向下一個節點信息,鏈式存儲結構用起來比較靈活。

這裏寫圖片描述

  • 查找

     從定義中可以知道鏈式存儲只有上一個節點才知道下一個節點在哪裏,如果想要查找某個節點數據,必須從上一個節點開始,依次往上推,也就是說需要從第一個節點開始搜索,知道找到我們要查找的節點,複雜度最壞爲n,即最後一個元素。

  • 插入、刪除
         

     鏈表在執行插入和刪除操作時,首先第一步也是找到需要刪除或者插入節點的位置,該查找過程爲O(i);當找到要刪除元素位置時,只需要進行指針變化就可以完成。

     觀察這個過程查找、插入、刪除都是先查找,如果只操作一個節點效率和順序存儲是一樣的,好處在於找到插入節點位置後進行頻繁插入、刪除操作後面的複雜度就都是O(1),從鏈式存儲結構的特性來看可以看出它適合進行頻繁插入操作,插入多個元素等情況,在進行插入刪除多的數據裏面使用鏈表來存儲數據會顯著提高效率。

鏈表幾種形式
- 單鏈表

     單鏈表即我們上面提到的這種形式,每個節點都有一個指向下一個節點的指針,只可以從前面找到後面的數據,而沒有辦法從後往前找元素,如果想從最後一個節點訪問第一個節點是訪問不到的,基於這種弊端,出現了循環鏈表。
- 循環鏈表

     把單鏈表的最後一個節點指針指向首節點,鏈表的各個元素就互相連接了起來組成了一個環形結構,我們把它定義爲循環鏈表,循環解決了從末尾訪問前端元素的問題,那麼如果我想從一個元素訪問它的前面的元素,怎麼訪問如果通過循環轉一圈那麼複雜度爲O(N-1),爲了進一步提高效率又出現了雙向鏈表。

這裏寫圖片描述

  • 雙向鏈表

     在每個節點中又增加了一個指向直接前驅的指針域,用來保存前一個節點的訪問地址,這樣可以從任何一個節點訪問它的前後節點,增加了鏈表的操作方便靈活性。

這裏寫圖片描述

總結

     本小節內容不多可以通過下面一張圖來代表,對於線性表結構在物理上面是這麼存儲的,下篇讓我們來分析一下java裏面ArrayList和LinkedList是如何來實現這一線性表特性的,敬請期待。

這裏寫圖片描述

問題

頭指針和頭結點的異同?

     頭指針比較好理解,指向第一個節點的指針叫做頭指針,它就好比數組中的首地址一樣具有標識數組的作用,它是必須存在的指針。
頭結點是我們爲了統一方式操作鏈表中各個節點而設置的一個特殊節點,當頭結點存在的時候,頭節點的數據域可以存儲鏈表長度等信息,它的指針叫做頭指針,但是地址指向第一個節點。

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