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