第三章 表、棧和隊列(一)概念

本寫作參考《數據結構與算法分析--C語言描述》,linux的list.h文件,以及數組和鏈表的一些理解

目的如下:

  • 簡要描述鏈表和數組爲什麼重要,具體主要是內存分配原因
  • 繪圖分析list.h的雙向鏈表,來看看雙向鏈表是如何拓展爲棧和隊列的
  • 分析一下雙向鏈表是如何面向對象的,爲什麼沒寫構造的函數

 

1、鏈表和數組

    鏈表和數組是對內存的兩種分配方式,通常是這樣:

數組是一個連續固定的空間,以起始地址爲開始,按照數據類型的大小增長。當數組的類型和起始地址確定後,數組的每個單元都是確定的。

CPU可以通過地址總線、數據總線一次訪問到要用的存儲單元。

鏈表是不連續的,它的單元由一個數據單元和兩個指針構成,每個單元通過左右指針鏈接起來就是鏈表。

 

因此算法上有如下區別:

數組:

1、事先要對錶進行估值,浪費空間(因爲空間大小是固定的,只考慮C定義下的數組)

2、insert、delete最壞時間是O(N),平均時間是最壞時間的一半,還是O(N)(因爲要移動其它數據,數組沒有指向)

      findKth是O(1)(只需要地址總線的一次查詢)

3、一般不用來做鏈表

 

鏈表:

1、內存不是連續的,因此只要申請一個單元,鏈接起來即可構成新的鏈表

2、insert、delete時間爲O(1)(申請單元后只需改變指向即可)

3、Find爲O(N)因爲要遍歷(其實FindKth也是O(N),訪問第幾個就要next幾次)

棧:

其實是鏈表這個對象的子對象,把細節隱藏起來,使鏈表只有表頭可見,只提供表頭的插入和刪除就是棧

 

隊列:

鏈表尾部插入,頭部取出刪除就是普通隊列,其餘部分隱藏。

 

 

 

 

 

 

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