【數據結構】詳細易懂解讀【順序表】以及Python實現

開始學習數據結構,那python裏的列表、元組、字典等高級結構就可以丟掉了,只有最基本數值結構和語法的搭配來構造相關順序表、鏈表、棧等結構

2.1 順序表類型

1個字節8位,1個存儲單元1個字節(Byte)

int32:佔用4個存儲單元

英文字符:1個存儲單元

  • 整型32舉例
    在這裏插入圖片描述

  • 混合類型

    • 元素外置,先計算

    • 再把計算出來的地址值,放置到連續的左邊的整型存儲結構裏。時間複雜度還是爲O(1)
      在這裏插入圖片描述

    • 英文字符
      在這裏插入圖片描述

2.2 順序表的結構與實現

一個順序表的完整信息包括兩部分,一部分是表中的元素集合,另一部分是爲實現正確操作而需記錄的信息,即有關表的整體情況的信息,這部分信息主要包括元素存儲區的容量和當前表中已有的元素個數兩項。
在這裏插入圖片描述

2.3 順序表的兩種基本實現方式

在這裏插入圖片描述

圖a爲一體式結構,存儲表信息的單元與元素存儲區以連續的方式安排在一塊存儲區裏,兩部分數據的整體形成一個完整的順序表對象。

一體式結構整體性強,易於管理。但是由於數據元素存儲區域是表對象的一部分,順序表創建後,元素存儲區就固定了。

圖b爲分離式結構,表對象裏只保存與整個表有關的信息(即容量和元素個數),實際數據元素存放在另一個獨立的元素存儲區裏,通過鏈接與基本表對象關聯。

2.4 元素存儲區替換

一體式結構由於順序表信息區與數據區連續存儲在一起,所以若想更換數據區,則只能整體搬遷,即整個順序表對象(指存儲順序表的結構信息的區域)改變了。

分離式結構若想更換數據區,只需將表信息區中的數據區鏈接地址更新即可,而該順序表對象不變。

2.5 順序表的操作

  • 增加元素
    在這裏插入圖片描述

a. 尾端加入元素,時間複雜度爲O(1)

b. 非保序的加入元素(不常見),時間複雜度爲O(1)

c. 保序的元素加入,時間複雜度爲O(n)

  • 刪除
    在這裏插入圖片描述

a. 刪除表尾元素,時間複雜度爲O(1)

b. 非保序的元素刪除(不常見),時間複雜度爲O(1)

c. 保序的元素刪除,時間複雜度爲O(n)

2.6 Python中的順序表

內置list和tuple的底層實現

Python中的list和tuple兩種類型採用了順序表的實現技術,具有前面討論的順序表的所有性質。

tuple是不可變類型,即不變的順序表,因此不支持改變其內部狀態的任何操作,而其他方面,則與list的性質類似。

list的基本實現技術

Python標準類型list就是一種元素個數可變的線性表,可以加入和刪除元素,並在各種操作中維持已有元素的順序(即保序),而且還具有以下行爲特徵:

  • 基於下標(位置)的高效元素訪問和更新,時間複雜度應該是O(1);
    爲滿足該特徵,應該採用順序表技術,表中元素保存在一塊連續的存儲區中。
  • 允許任意加入元素,而且在不斷加入元素的過程中,表對象的標識(函數id得到的值)不變。
    爲滿足該特徵,就必須能更換元素存儲區,並且爲保證更換存儲區時list對象的標識id不變,只能採用分離式實現技術。

在Python的官方實現中,list就是一種採用分離式技術實現的動態順序表。這就是爲什麼用list.append(x) (或 list.insert(len(list), x),即尾部插入)比在指定位置插入元素效率高的原因。