簡體   English   中英

計算該算法的時間復雜度

[英]Calculating the time complexity of this algorithm

我正在嘗試計算此算法的時間復雜度,該算法確定是否可以將正整數N表示為x ^ y。 該算法的作者是Vaibhav Gupta

// Returns true if n can be written as x^y
bool isPower(unsigned int n)
{
    // Base case
    if (n <= 1) return true;

    // Try all numbers from 2 to sqrt(n) as base
    for (int x=2; x<=sqrt(n); x++)
    {
        unsigned  p = x;

        // Keep multiplying p with x while is smaller
        // than or equal to x
        while (p <= n)
        {
            p *= x;
            if (p == n)
                return true;
        }
    }
    return false;
}

作者說,該算法是第一個算法的優化版本,它是:

// Returns true if n can be written as x^y
bool isPower(unsigned n)
{
    if (n==1)  return true;

    // Try all numbers from 2 to sqrt(n) as base
    for (int x=2; x<=sqrt(n); x++)
    {
        unsigned y = 2;
        unsigned p = pow(x, y);

        // Keep increasing y while power 'p' is smaller
        // than n. 
        while (p<=n && p>0)
        {
            if (p==n)
                return true;
            y++;
            p = pow(x, y);
         }
    }
    return false;
}

自從他使用pow函數以來,這第一個具有不同的時間復雜度嗎?

當返回false時,該算法將嘗試增加所有整數x ,直到它們超過n為止。 嘗試x = √n后,搜索將停止。

因此,對於粗略評估,評估直到x^d = n的冪大約需要log n/log x乘,然后從x=2重復到x=√n

因此,復雜性就像

log n.Sum(x=2 to √n)1/log x

這很難估計,但是O(log n.√n)Ω(√n)

pow版本采用log d乘而不是1來計算冪,但前提是要通過重復平方來計算。 由於d = log n/log x ,復雜度就像

log n.Sum(x=2 to √n)(log log n - log log x)/log x

甚至更難估計,但是O(log n.log log n.√n)Ω(√n)

對於int類型覆蓋的n范圍,可以預期pow版本的速度要慢1到5倍(除非pow函數的開銷很大)。

在我看來,外循環是n的平方根,而內循環按對數n的順序排列(因為數字呈指數增長),因此您的復雜度應為

  O(sqrt(n)*log n)

暫無
暫無

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

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