為什麼 Python 的 in 用在 set 是 O(1) 時間複雜度?

通常都會說 Python 的 set 內部是用 hash table 來實作,所以是 O(1),但為什麼這樣就是 O(1)?

當要判斷某個元素是否在 set 裡面時,它的 __hash__() 會被用來得到 hash 值,可以把這個 hash 值視為 set 底層實作的 array 的 index,Python 接著會用這個 hash 值去那個 array 的對應位置找,然後發現 array 沒有這個位置,或是找到對應 value,而這個過程跟 set 裡的元素個數無關,所以是 O(1)

而這邊說的 O(1) 是平均時間複雜度,最壞情況時間複雜度是 O(n),

遞迴的時間複雜度算法

快速解 (適用於遞迴函式內呼叫自己 > 1 次)

  1. 看這個遞迴函式呼叫自己幾次,假設呼叫了 x
  2. 看看這個函式的遞迴深度。也就是說這個函式的初始呼叫會需要經過幾次的呼叫自己才會再也沒有任何呼叫,每條路都停止在 base case (終止條件)
    • 舉例:可以先看看下面的詳細解,初始呼叫為 u_paths(0, 0),此時 u_paths(i + 1, j) 需要呼叫 m 次才會停,u_paths(i, j + 1) 需要呼叫 n 次才會停,所以總共呼叫 m + n 次才會停,此時遞迴深度 h = m + n
  3. 承上例,此時時間複雜度為 O(x^h)
  • 至少目前套用在幾個比較單純的遞迴式都成立,不確定複雜的是不是也成立

為什麼 Python dict 的 get item operation 時間複雜度為 O(1) ?

如果去 google,大部分查到的都會說因為 Python 會把 key 經過 hash function 運算,得到一個 dict 真正內部在使用的 key,從而找到對應的 value。而一個好的 hash function 它的運算所需時間是不會隨著 n 增加而變大的,所以 dict 的 get item operation 時間複雜度為 O(1) 。

不過我的疑惑是,經過 hash function 運算得到 key 之後,由這個 key 去找到 value 的時間複雜度是 O(1) 嗎?除非這個也是 O(1) 才能說整個 get item operation 是 O(1) 。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×