我们可以说下面的算法的复杂性恰好是O(lgn)

时间:2014-03-23 08:14:03

标签: string int big-o complexity-theory time-complexity

我编写了一个将整数转换为字符串的函数。我们可以说这个算法的复杂度恰好是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;
}

2 个答案:

答案 0 :(得分:0)

我们了解到您的问题是关于O(lg(N)) vs lg(N)+1

您需要返回the definition of big-O notation

它声明可以使用任何函数作为运行时间的上限,以获得足够大的参数值,并乘以适当的常量。

您可以轻松检查lg(N)+1O(lg(N))还是O(log(N)) [基数10]还是O(ln(N)) [基数e]或O(lg(N)+1)O(lg(N)/4+1000/N)O(Hn) [和弦数字] ......

您还lg(N)+1O(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>