将小数转换为另一个基数的时间复杂度

时间:2013-07-15 08:09:29

标签: java complexity-theory

这是一个计算十进制数基本版本的代码。我不确定它的时间复杂性。 谢谢,

public static String convertToBase(int num, int base) {
    if (base > 36) {
        throw new IllegalArgumentException("The input argument should be less than or equal to 36.");
    }
    final StringBuilder sb = new StringBuilder();
    while (num > 0) {
        final int div = num % base;
        if (div > 9) {
            final int sum = div + 55;
            sb.append((char) sum);
        } else {
            sb.append(div);
        }
        num = num / base;
    }
    return sb.reverse().toString();
}

3 个答案:

答案 0 :(得分:2)

严格来说,答案是O(1)

如果int是支持任意精度的整数类型,那么答案显然是O(logN)

但事实并非如此! int不得超过Integer.MAX_INT,其中2 ^ 31 - 1 ...或大约20亿。

因此,如果我们让N(无界整数)倾向于无穷大,num的值会回绕,以使它永远不会超过Integer.MAX_INT。这意味着,如果(例如)base10,则while循环最多可以 log10(2^31)次执行(即10次)。 ..而convertToBaseO(1)

但是,如果您准备滥用术语/符号,可以表示它O(logN)足够小N

答案 1 :(得分:1)

算法的复杂性是

IF Base = 36,num = 35 .............迭代次数为1 IF Base = 02,num = 35 .............迭代次数为6

这里的数字迭代次数=以(log)为基数的(num)的Log。

因此时间复杂度很大-O(Log(n))

答案 2 :(得分:1)

正如Stephen C所说,复杂性是O(1),因为n是有界的。

如果n是任意精度数,则复杂度为 O(M(n)log(n)) 其中M(n)是乘法的复杂性(因为有“num / base”运算)。

请参阅 http://en.wikipedia.org/wiki/Computational_complexity_of_mathematical_operations#Arithmetic_functions