[英]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.