鏈表的基本原理

   這幾天正好辭職,在家閒着讀書,感覺自己數據結構與算法這塊始終是一個弱項,所以就以博客的形式記錄自己重讀經典的過程。水平有限,文中不免出現謬誤,還請閱讀本文的童鞋指正。每個抽象數據結構都會以三種強類型語言C、C++、Java實現

  引子中將強類型這個詞設置成了粗體,主要是因爲我想從這個話題開始討論關於語言及與語言不相關的抽象數據類型。
  那麼何爲類型,類型存在的意義是什麼?何爲強類型呢?

  要回答這個問題,我們需要從編譯器、內存分配的角度去考慮。衆所周知,在計算機的世界裏,操作的所有data都是用0與1的組合表示(內存或者磁盤中),0或者1又是以一個bit存儲的,8個bit又組成了1個byte....爲了確定一個數據由多少個0與1組合而成,即爲了確定某個數據佔用多少個bit,就有了如下的示意圖:


   

站在編程語言的角度類型存在的意義有兩點:
  1.編譯器在編譯期需要確定某個數據佔用多少個存儲單元,便於運行期分配內存。
  2.站在程序員的角度,類型可以用來表示現實世界存在的事物。
所以所有的強類型語言都會規定數據類型由多少位多少字節來存儲,如c的int類型。
這就引申出各種強類型語言的基本數據類型、抽象數據類型佔用存儲單元的長度問題,試想如下問題:
   int array[10];
   該數組佔用多少內存呢?
   (需要考慮特定語言及特定編譯器)
明白了以上問題,我們接下來討論抽象數據類型(ADT)。
   首先,需要明確,什麼是抽象數據類型?
   用我自己的話來說來說就是由基本數據類型組成的數據類型,如一個一維的整型數組。
   抽象數據類型存在的意義在於,當我們要解決特定問題時,抽象數據類型可以爲我們提供合適的存儲形式及檢索方法。
   其次,針對一個問題,如何選擇最合適(從算法的空間複雜度與時間複雜度去考慮)的數據結構呢?
   一組數據加載到內存後只進行簡單的查詢(不考慮大量數據的極端情況),那麼從算法的角度來說我們選擇線性表較爲合適;
    該組數據需要插入或刪除某些數據,選擇鏈表比較合適。
    在處理大數據時,hash表又成了一個很好的選擇。
    ...

1.線性表:一塊連續分配的存儲單元
    對線性表的所有操作都可以通過數組來實現,這裏就不做討論了。
2.鏈表:爲了避免線性表的插入及刪除的線性開銷,我們需要允許表可以不連續存儲,所以就有了鏈表的一般想法:


每個節點持有一個指向下一個節點的引用或者指針,使整個表結構呈現出一個鏈條的形式。


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