如何使其具有O(1)而不是O(n)的空间复杂度?

时间:2017-10-14 19:13:09

标签: java algorithm binary iteration decimal

我正在尝试使用迭代过程将小数转换为二进制数。如何使其空间复杂度为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]);
}   

1 个答案:

答案 0 :(得分:0)

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

而且,关于O(1) ...也许并不是你在想什么,但是:
Javas int有一个特定的固定值范围,这可以保证(正)int值需要最多31位(如果你也有负数,那么在某处存储符号是必要的,那就是32)。

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

走这条小小的路线对这里没有帮助。如果您的值满足某些条件,则有一些有用的快捷方式,但如果您希望代码使用任何int值,那么您在此处获得的正常循环可能是您可以获得的最佳值。

(对你而言,CPU内在函数可能会有所帮助,但不适用于Java ......)