簡體   English   中英

就大 O 而言,給定 function 的時間復雜度應該是多少?

[英]What should be the time complexity of the given function in terms of Big O?

int find_peak (int n, int A []) {
    int left, right, lmid, rmid;
    left = 0;
    right = n - 1;
    while (left + 3 <= right) {
        lmid = (2 * left + right) / 3;
        rmid = (left + 2 * right) / 3;
        if (A[lmid] <= A[rmid])
            left = lmid;
        else
            right = rmid;
    }
    int x = left;
    for (int i = left + 1; i <= right; i ++)
        if (A[i] > A[x])
            x = i;
    return A[x];
}

我試圖解決這個 function 的 BigO 表示法,但我對此很困惑。 是 O(log n) 還是別的什么? 我可以在腦海中解決它,但我不能正確地做到這一點。

是的,循環在每次迭代時大致減半

lmid = (2 * left + right) / 3;
rmid = (left + 2 * right) / 3;
if (A[lmid] <= A[rmid])
    left = lmid;
else
    right = rmid;

准確地說,它是log 1.5 (n) ,因為實際right-left長度只減少了1 / 3 ,而不是將迭代減半。 復雜度仍然是O(log(n))

你可以在這里試試 https://onlinegdb.com/rkI5gn3Xd


感謝 chqrlie 提示我給出更詳細的答案

上述代碼的復雜度應該是O(log3n)即.. logn base 3 因為在while 循環rmid的值總是大於lmid 。所以,對於給定的 right 值,即 .. n ,每次迭代時 left 的值將減少 1/3 的倍數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM