【问题标题】:How do I make this have a space complexity of O(1) instead of O(n)?如何使它具有 O(1) 而不是 O(n) 的空间复杂度?
【发布时间】:2018-03-26 16:18:40
【问题描述】:

我正在尝试使用迭代过程将十进制数转换为二进制数。我怎样才能使它的空间复杂度为 O(1) 而不是 O(n)?

int i = 0;
int j;
int bin[] = new int[n]; //n here is my paramater int n
while(n > 0) {
   bin[i] = n % 2;
   n /= 2;
   i++;
}

//I'm reversing the order of index i with variable j to get right order (e.g. 26 has 11010, instead of 01011)
for(j = i -1; j >= 0; j--) {
   System.out.print(bin[j]);
}   

【问题讨论】:

  • 阅读按位运算符和一般的位操作(或“位摆弄”)。

标签: java algorithm binary iteration decimal


【解决方案1】:

首先,如果值本身是n,则不需要n 位的位置。你只需要log2(n)+1。使用n 位不会给您错误的结果,但是对于n 的大值,Java 进程可用的内存可能不够。

还有,关于O(1)...也许不是你真正想的那样,但是:
Javas int 有一个特定的固定值范围,这保证了(正)int 值需要最大 31 位(如果您也有负数,则需要将符号存储在某处,即第 32 位)。

有了这些信息,严格来说,你可以通过重写你的循环来得到 O(1),这样它们就可以精确地循环 31 次。然后,对于n 的每个值,您的代码具有完全相同的步数,即每个定义为O(1)

在这里,走这条小路无济于事。如果您的值满足某些条件,则有一些有用的快捷方式,但如果您希望您的代码使用任何 int 值,那么您在这里拥有的正常循环可能是您可以获得的最好的。

(对你来说,CPU 内在函数可能会有所帮助,但对 Java 没有帮助...)

【讨论】:

    猜你喜欢
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多