我编写了一个将整数转换为字符串的函数。我们可以说这个算法的复杂度恰好是O(lgn)吗?因为输入字符串中的字符数正好是lgn + 1.
char* int_to_str(int n)
{
int size = 0;
bool is_neg = false;
int m = n;
if (n < 0)
{
is_neg = true;
m = n - (n << 1);
}
int k = m;
while(k > 0)
{
k /= 10;
++size;
}
char* out;
if(is_neg)
{
out = new char[++size];
}
else
{
out = new char[size];
}
int i = size;
out[i] = '\0';
while(m > 0 && i >= 0)
{
out[--i] = (char)((m % 10) + '0');
m /= 10;
}
if(is_neg)
{
out[0] = '-';
}
return out;
}
答案 0 :(得分:0)
我们了解到您的问题是关于O(lg(N))
vs lg(N)+1
。
您需要返回the definition of big-O notation。
它声明可以使用任何函数作为运行时间的上限,以获得足够大的参数值,并乘以适当的常量。
您可以轻松检查lg(N)+1
是O(lg(N))
还是O(log(N))
[基数10]还是O(ln(N))
[基数e
]或O(lg(N)+1)
或O(lg(N)/4+1000/N)
或O(Hn)
[和弦数字] ......
您还lg(N)+1
为O(N)
或O(N^2)
或O(N!)
......但这些界限并不紧张。
答案 1 :(得分:0)
O(lg(N))与O(lg(N)+ 1)相同,只是常数不同。
g(x)= O(f(x))表示存在常数k,x0,使得g(x)<= k * f(x),对于x> = x0
假设h(x)= O(f(x)+ 1)。这意味着存在常数k1,x1 所有x> = x1
的h(x)&lt; = k1 *(f(x)+ 1) 对于所有x> = x1 ,或h(x)&lt; = k1 * f(x)+ k1
如果我们有g(x)单调递增,如果我们认为h(x1) - g(x0)可能大于k1,我们可以说g(x)= O(f(x)+ 1)。
由于lg(N)单调增加且没有上限,我们可以断言O(lg(N))和O(lg(N)+)是相同的,并且一个边界并不比另一个强。 / p>