我需要找到一个高度优化的算法来排序一个只包含0 n 1的数组。
我的解决方案版本是计算编号。零(比如说x)和(比如说y)。完成后,在数组中放置x零,然后输入y 1s。这使它成为O(n)。
任何跑得比这更好的算法???我在面试中被问到这个问题。
答案 0 :(得分:10)
由于您必须检查每个n
输入元素,因此无法改进O(n)
。
此外,由于你的算法需要O(1)
内存,你也无法改进(没有什么比O(1)
渐近更好。)
答案 1 :(得分:7)
我们不能比O(n)做得更好,但看起来我们可以一次性完成
low = 0;
high = arr.length - 1;
while (low < high) {
while (arr[low] == 0) {
low ++;
}
while (arr[high] == 1) {
high --;
}
if (low < high) {
//swap arr[low], arr[high]
}
}
答案 2 :(得分:5)
如果对数组求和,则可以得到1的数,效率稍高,但仍为O(n)。
答案 3 :(得分:3)
你不能比O(N)更有效率,因为每个项目都需要进行检查。
答案 4 :(得分:2)
我们在谈论什么样的“数组”?如果我们计算16位无符号整数中的位,那么已经开发了几个O(1)时间算法:参见Fast Bit Count Routines。
这是那里提出的算法之一;他们称之为Nifty Parallel Count:
#define MASK_01010101 (((unsigned int)(-1))/3)
#define MASK_00110011 (((unsigned int)(-1))/5)
#define MASK_00001111 (((unsigned int)(-1))/17)
int bitcount (unsigned int n) {
n = (n & MASK_01010101) + ((n >> 1) & MASK_01010101);
n = (n & MASK_00110011) + ((n >> 2) & MASK_00110011);
n = (n & MASK_00001111) + ((n >> 4) & MASK_00001111);
return n % 255 ;
}
答案 5 :(得分:0)
这听起来像单棒算盘。 现在我很好奇你的面试官是谁。