Python幾種資料結構內建方法的時間複雜度
阿新 • • 發佈:2019-01-10
參考:https://blog.csdn.net/baoli1008/article/details/48059623
注:下文中,’n’代表容器中元素的數量,’k’代表引數的值,或者引數的數量。
1.列表(list)
-
以完全隨機的列表考慮平均情況。
-
列表是以陣列(Array)實現的。
-
最大的開銷發生在超過當前分配大小的增長,這種情況下所有元素都需要移動;或者是在起始位置附近插入或者刪除元素,這種情況下所有在該位置後面的元素都需要移動。
-
如果需要在一個佇列的兩端進行增刪的操作,應當使用collections.deque(雙向佇列)
-
操作 操作說明 時間複雜度(平均情況) 時間複雜度(最壞情況) index(value) 查詢list某個元素的索引 O(1) O(1) a=index(value) 索引賦值 O(1) O(1) list[:] 列表複製 O(n) O(n) list.append(value) 隊尾新增 O(1) O(1) list.insert(index, value) 根據索引插入某個元素 O(n) O(n) list[index] 取元素 O(1) O(1) list[index]=value 賦值 O(1) O(1) list.pop() 隊尾刪除 O(1) O(1) list.pop(index) 根據索引刪除某個元素 O(n) O(n) [i for i in list] 遍歷/迭代 O(n) O(n) list[m:n] 取切片 O(k) O(k) del list[m:n] 刪除切片 O(n) O(n) list[m:n]=[n] 更改切片 O(k+n) O(k+n) list.extend([]) 列表擴充套件 O(k) O(k) list.sort() 列表排序 O(nlogn) O(nlogn) list*n 列表乘法 O(nk) O(nk) i in list 列表搜尋 O(n) min(list), max(list) 取最大和最小值 O(n) len(list) 計算長度 O(1) O(1)
2.字典(dict)
- 下列字典的平均情況基於以下假設:
- 物件的雜湊函式足夠健壯(robust),不會發生衝突。
- 字典的鍵是從所有可能的鍵的集合中隨機選擇的。
-
操作 操作說明 平均情況 最壞情況 copy 複製 O(n) O(n) dict[key] 取元素 O(1) O(n) dict[key]=value 更新元素 O(1) O(n) del dict[key] 刪除元素 O(1) O(n) [i for i in dict] 遍歷字典 O(n) O(n) i in dict 搜尋元素 O(1) O(1)
3.集合(set)
-
操作 操作說明 平均情況 最壞情況 i in set 搜尋元素 O(1) O(n) set_1 | set_2 並集 O(len(set_1)+len(set_2)) set_1 & set_2 交集 O(min(len(set_1), len(set_2)) O(len(set_1) * len(set_2)) set_1 - set_2 差集 O(len(set_1)) set.difference_update(set_2) 更新 O(len(set_2)) set^t 對稱差集 O(len(set)) O(len(set) * len(t)) set.symmetric_difference_update(t) O(len(t)) O(len(t) * len(set))
- 差集(set_1 - set_2,或set_1.difference(set_2))運算與更新為差集(set_1.difference_uptate(set_2))運算的時間複雜度並不相同:
- 前者是將在set_1中,但不在set_2中的元素新增到新的集合中,因此時間複雜度為O(len(set_1))。
- 後者是將在set_2中的元素從set_1中移除,因此時間複雜度為O(len(set_2))。