python列表是顺序表还是链表_顺序表与链表
Python中的順序表
Python中的list和tuple兩種類型采用了順序表的實現技術,具有前面討論的順序表的所有性質。
tuple是不可變類型,即不變的順序表,因此不支持改變其內部狀態的任何操作,而其他方面,則與list的性質類似。
list的基本實現技術
Python標準類型list就是一種元素個數可變的線性表,可以加入和刪除元素,并在各種操作中維持已有元素的順序(即保序),而且還具有以下行為特征:
基于下標(位置)的高效元素訪問和更新,時間復雜度應該是O(1);
為滿足該特征,應該采用順序表技術,表中元素保存在一塊連續的存儲區中。
允許任意加入元素,而且在不斷加入元素的過程中,表對象的標識(函數id得到的值)不變。
為滿足該特征,就必須能更換元素存儲區,并且為保證更換存儲區時list對象的標識id不變,只能采用分離式實現技術。
在Python的官方實現中,list就是一種采用分離式技術實現的動態順序表。這就是為什么用list.append(x) (或 list.insert(len(list), x),即尾部插入)比在指定位置插入元素效率高的原因。
在Python的官方實現中,list實現采用了如下的策略:在建立空表(或者很小的表)時,系統分配一塊能容納8個元素的存儲區;在執行插入操作(insert或append)時,如果元素存儲區滿就換一塊4倍大的存儲區。但如果此時的表已經很大(目前的閥值為50000),則改變策略,采用加一倍的方法。引入這種改變策略的方式,是為了避免出現過多空閑的存儲位置。
順序表的操作
增加元素
如圖所示,為順序表增加新元素111的三種方式
a. 尾端加入元素,時間復雜度為O(1)
b. 非保序的加入元素(不常見),時間復雜度為O(1)
c. 保序的元素加入,時間復雜度為O(n)
刪除元素
a. 刪除表尾元素,時間復雜度為O(1)
b. 非保序的元素刪除(不常見),時間復雜度為O(1)
c. 保序的元素刪除,時間復雜度為O(n)
鏈表
為什么需要鏈表
順序表的構建需要預先知道數據大小來申請連續的存儲空間,而在進行擴充時又需要進行數據的搬遷,所以使用起來并不是很靈活。
鏈表結構可以充分利用計算機內存空間,實現靈活的內存動態管理。
鏈表的定義
鏈表(Linked list)是一種常見的基礎數據結構,是一種線性表,但是不像順序表一樣連續存儲數據,而是在每一個節點(數據存儲單元)里存放下一個節點的位置信息(即地址)。
鏈表與順序表的對比
鏈表失去了順序表隨機讀取的優點,同時鏈表由于增加了結點的指針域,空間開銷比較大,但對存儲空間的使用要相對靈活。
鏈表與順序表的各種操作復雜度如下所示:
操作鏈表順序表
訪問元素
O(n)
O(1)
在頭部插入/刪除
O(1)
O(n)
在尾部插入/刪除
O(n)
O(1)
在中間插入/刪除
O(n)
O(n)
注意雖然表面看起來復雜度都是 O(n),但是鏈表和順序表在插入和刪除時進行的是完全不同的操作。鏈表的主要耗時操作是遍歷查找,刪除和插入操作本身的復雜度是O(1)。順序表查找很快,主要耗時的操作是拷貝覆蓋。因為除了目標元素在尾部的特殊情況,順序表進行插入和刪除時需要對操作點之后的所有元素進行前后移位操作,只能通過拷貝和覆蓋的方法進行。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的python列表是顺序表还是链表_顺序表与链表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python自动生成表格_Python自
- 下一篇: vue实现查询多条记录_vue.js 实