1. 程式人生 > >Python幾種資料結構內建方法的時間複雜度

Python幾種資料結構內建方法的時間複雜度

參考: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))。