Complexity

多對數和對數有什麼區別?

  • June 26, 2017

我無法想像一個不是polylogarithmic 而是logarithmic的。

$ O(\log N) $ 滿足兩者。

關於什麼 $ O(\log^{3}N) $ , $ O(\log^{100}N) $ , 和 $ O(\log^{10000}N) $ ?

比方說 $ N=10^{10} $

定義:

據說一個算法執行在

  • 對數時間如果 $ T(n) = O(log(n)) $
  • 多對數時間如果 $ T(n) = O(log(n)^k) $ (也寫為 $ T(n) = O(log^k(n)) $ )

這意味著它們對於 $ k=1 $ . 否則它們是不同的,你的其他例子都是多對數的。我不確定如何確切地解釋差異是什麼,但也許一張圖片會幫助你*:*

log(x) 和 log^3(x)

如果 ,則稱算法需要對數時間T(n) = O(log n)

如果T(n) = O((log n)^k),對於某個常數 k,則稱算法在多對數時間內執行。

維基百科:時間複雜度

對數時間

如果一個算法需要對數時間,如果 $ T(n) = O(\log n) $ . 由於電腦使用二進制數字系統,對數通常以 2 為底(即, $ \log_2 n $ , 有時寫 $ \lg n $ )。然而,通過改變對數的底數, $ \log_a n $ 和 $ \log_b n $ 僅由一個常數乘數不同,這在大 $ O $ 符號被丟棄;因此 $ O(\log n) $ 是對數時間算法的標準表示法,與對數的底數無關。

採用對數時間的算法通常在二叉樹的操作或使用二分搜尋時發現。

一個 $ O(\log n) $ 算法被認為是高效的,因為完成每個實例所需的每個實例的操作都會減少。

這種類型的一個非常簡單的範例是一種算法,它將字元串切成兩半,然後將右半部分切成兩半,依此類推。這將需要 $ O(\log n) $ 時間 ( $ n $ 是字元串的長度),因為我們在每次列印之前將字元串切成兩半(我們假設 console.log 和 str.substring 在恆定時間內執行)。這意味著,為了增加列印次數,我們必須將字元串的長度加倍。

多對數時間

如果一個算法在多對數時間內執行,如果 $ T(n) = O((\log n)^k) $ , 對於某個常數 $ k $ . 例如,矩陣鏈排序可以在並行隨機存取機上以多對數時間求解。

引用自:https://crypto.stackexchange.com/questions/48638