06: 字典、順序表、列表、hash樹 實現原理

算法其餘篇

目錄:

1.1 python中字典對象實現原理     返回頂部

    注:字典類型是Python中最經常使用的數據類型之一,它是一個鍵值對的集合,字典經過鍵來索引,關聯到相對的值,理論上它的查詢複雜度是 O(1) html

  一、哈希表 (hash tables)python

      1. 哈希表(也叫散列表),根據關鍵值對(Key-value)而直接進行訪問的數據結構。算法

      2. 它經過把key和value映射到表中一個位置來訪問記錄,這種查詢速度很是快,更新也快。數組

      3. 而這個映射函數叫作哈希函數,存放值的數組叫作哈希表。 數據結構

      4. 經過把每一個對象的關鍵字k做爲自變量,經過一個哈希函數h(k),將k映射到下標h(k)處,並將此對象存儲在這個位置。app

  二、具體操做過程ide

      1. 數據添加:把key經過哈希函數轉換成一個整型數字,而後就將該數字對數組長度進行取餘,取餘結果就看成數組的下標,
                        將value存儲在以該數字爲下標的數組空間裏。函數

      2. 數據查詢:再次使用哈希函數將key轉換爲對應的數組下標,並定位到數組的位置獲取value。spa

  三、{「name」:」zhangsan」,」age」:26} 字典如何存儲的呢? 3d

      1. 好比字典{「name」:」zhangsan」,」age」:26},那麼他們的字典key爲name、age,假如哈希函數h(「name」) = 一、h(「age」)=3,

      2. 那麼對應字典的key就會存儲在列表對應下標的位置,[None, 「zhangsan」, None, 26 ]

  四、解決hash衝突

      

1.2 順序表     返回頂部

  一、順序表特色

      1. 線性表的邏輯順序與物理順序一致,數據元素之間的關係是以元素在計算機內「物理位置相鄰」來體現。

      2. 對順序表中的全部表項,便可以進行順序的訪問,也能夠隨機的訪問,也就是說,
          既能夠從表的第一個表項開始逐個訪問表項也能夠按照表項的序號(下標)直接的訪問。

      3. 無需爲表示結點間的邏輯關係而增長額外的存儲空間,存儲利用率提升。

      4. 能夠方便的存儲表中的任一結點,存儲速度快。

      缺點:

        1)在表中插入新元素或刪除無用元素時,爲了保持其餘元素的相對次序不變,平均須要移動一半元素,運行效率低
        2)因爲順序表要求佔用連續的空間,若是預先進性存儲分配,則當表長度變化較大時,難以肯定合適的存儲空間帶大小
        3)若按可能達到的最大的長度預先分配表的空間,則容易形成一部分空間長期的限制而得不到充分的利用

  二、鏈表

      1. 鏈表是一種物理存儲單元上非連續、非順序的存儲結構,數據元素的邏輯順序是經過鏈表中的指針連接次序實現的。

      2. 鏈表由一系列結點(鏈表中每個元素稱爲結點)組成,結點能夠在運行時動態生成。

      3. 每一個結點包括兩個部分:數據域和指針域

      特色:

        1)能夠方便的進行擴充。

        2)能夠方便的刪除和插入。

  三、順序表的線性存儲示意圖   

      1. 假設線性表中有n個元素,每一個元素佔k個存儲單元,第一個元素的地址爲Loc(a1),則第i個元素的地址Loc(ai):

      2. Loc(ai) = Loc(a1) + (i-1) * k; # 其中Loc(a1)稱爲基地址。

        

  四、順序表增刪改查原理

# 一、順序表的初始化
 順序表的初始化就是把順序表 初始化爲空的順序表;只需把順序表的長度length置爲0便可; # 二、求順序表的長度
 順序表的長度就是就順序表中的元素的個數,因爲在插入和刪除操做中都有對數據表的長度進行修改,因此求表長只需返回length的值便可; # 三、按序號查找
 查找順序表中第i個元素的值(按序號查找),若是找到,將將該元素值賦給e。 查找第i個元素的值時,首先要判斷查找的序號是否合法,若是合法,返回第i個元素對應的值。 # 四、插入元素
 在數據表的第i個位置插入元素,在順序表的第i個位置插入元素e 首先將順序表第i個位置的元素依次向後移動一個位置,而後將元素e插入第i個位置,移動元素要從後往前移動元素, 即:先移動最後一個元素,在移動倒數第二個元素,依次類推; 插入元素以前要判斷插入的位置是否合法,順序表是否已滿,在插入元素以後要將表長L->length++; # 五、刪除操做
 刪除表中的第i個元素e,刪除數據表中的第i個元素,須要將表中第i個元素以後的元素依次向前移動一位,將前面的元素覆蓋掉。 移動元素時要想將第i+1個元素移動到第i個位置,在將第i+2個元素移動i+1的位置,直到將最後一個元素移動到它的前一個位置。 進行刪除操做以前要判斷順序表是否爲空,刪除元素以後,將表長L->length--; # 六、按內容查找
 查找數據元素e在表中的位置,能夠從表頭開始一直遍歷表中元素。 若是找到與要查找元素e相等的元素,則返回元素在表中的位置,數組下標從0開始。 則元素在表中對應的位置序號值應爲對應數組下標加1,沒有找到則返回0。 # 七、頭插
 頭插,即在表頭插入元素e,在表頭插入元素,須要將表中的元素依次後移一位, 而後將要插入的元素e賦給數字的首元素,執行插入操做後將表長L->length++; 須要注意的是移動元素要從順序表的最後一個元素開始移動, 若是從第1個元素開始移動,會使得第1個元素的值覆蓋第2個元素的值,而後把第二個元素後移則會使第2個元素的值 (原來第1個元素值)覆蓋第3個元素的值,依次類推,最後出插入元素外,其他元素值均爲原順序表中第一個元素的值。 # 八、頭刪
 刪除順序表中的第一個元素,只要將順序表中的元素從第2個開始,依次向前移動1位,覆蓋原來順序表中元素對應位置的前一個值 在刪除元素以前要判斷順序表是否爲空,刪除順序表元素以後將順序表長度L->length--; # 九、尾插
    在順序表表尾插入元素e,L->data[L->length] = e;將元素e的值賦給順序表中最後一個元素的下一個元素; 尾插操做,須要判斷順序表是否已滿,尾插後將順序表長度L->length++; # 十、尾刪
 刪除表尾元素,只需將順序表的長度減1,相似於出棧操做,棧頂指針top –。 # 十一、清空順序表
 清空順序表就是將表中的元素刪除。刪除表中的元素只需將表的長度置爲0。 # 十二、判斷表是否爲空
 若是順序表的長度爲0,則順序表爲空,返回1,不然,返回0; # 1三、打印表中元素
 依次打印順序表中的元素,若是順序表爲空則輸出提示。 
順序表增刪改查原理

1.3 python 列表(list)     返回頂部

  一、python列表

      1. 在CPython中,列表被實現爲長度可變的數組。

      2. 列表對象在 C 程序中的數據結構:有一個指針數組用來保存列表元素的指針,和一個能夠在列表中放多少元素的標記。

      3. 內存的槽的個數並非當前列表就有這麼多的元素,列表元素的個數和 len(列表)是同樣,就是真正的元素的個數。

      4. 但分配的槽的大小,會比元素個數大一點,目的就是爲了防止在每次添加元素的時候都去調用分配內存的函數。

  二、C中數組存儲方式

      1. 必須牢記:定義並初始化一個數組後,在內存裏分配了兩個空間,一個用於存放數組的引用變量,一個用於存放數組自己。

      2. 數組引用變量只是一個引用,這個引用變量能夠指向任何有效的內存,只有當該引用指向有效內存後,纔可經過該數組變量來訪問數組元素。

      3. 若是咱們但願在程序中訪問數組,則只能經過這個數組的引用變量來訪問它。

      4. 實際的數組元素被存儲在堆(heap)內存中;數組引用變量是一個引用類型的變量,被存儲在棧(stack)內存中。

  三、python列表操做時間複雜度

      index() O(1)

      append O(1)

      pop() O(1)

      pop(i) O(n)

      insert(i,item) O(n)

      del operator O(n)

      reverse O(n)

      sort O(nlogn)

  四、列表和元組比較

      1. 列表是動態的,其大小能夠改變(從新分配);
      2. 而元組是不可變的,一旦建立就不能修改。
      3. list和tuple在c實現上是很類似的,對於元素數量大的時候,都是一個數組指針,指針指向相應的對象,找不到tuple比list快的理由。
      4. 但對於小對象來講,tuple會有一個對象池,因此小的、重複的使用tuple還有益處的。

  五、tuple使用場景

      1. 實際狀況中的確也有很多大小固定的列表結構,例如二維地理座標等;

      2. 另外tuple也給元素自然地賦予了只讀屬性;

  六、列表與字典比較

      1. list是有序的,dict是無序的

      2. list經過索引訪問,dict使用key訪問

      3. list隨着數量的正常增加要想查找元素的時間複雜度爲O(n), dict不隨數量而增加而變化,時間負責都爲O(1)

  七、列表和字典應用場景

      1. list通常可做爲隊列、堆棧使用,而dict通常做爲聚合統計或者快速使用特徵訪問等

      2. list 是記錄簡單有序數據的,就是一對一的那種,能夠理解爲一維數組.

      3. dict 是記錄複雜無序數據,就是一對多,能夠理解爲多維數組.

相關文章
相關標籤/搜索