0s n 1sのみで構成される配列をソートするには、高度に最適化されたアルゴリズムを見つける必要があります。
解決策の私のバージョンは、番号を数えることです。ゼロ(たとえばx)と1(たとえばy)の。これを行ったら、配列にx個のゼロを配置し、その後にy1を配置します。これにより、O(n)になります。
これよりもうまくいくアルゴ??? 私はインタビューでこの質問をされました。
各入力要素を調べる必要があるためn
、を改善することはできませんO(n)
。
また、アルゴリズムにはO(1)
メモリが必要なため、それを改善することもできません(漸近的に優れているものはありませんO(1)
)。
O(n)よりもうまくいくことはできませんが、1回のパスでできるように見えます
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]
}
}
配列を合計すると、1の数が得られ、わずかに効率的ですが、それでもO(n)になります。
各アイテムを検査する必要があるため、O(N)よりも効率的です。
どんな「配列」について話しているのですか?16ビットの符号なし整数のビットをカウントする場合、いくつかのO(1)時間アルゴリズムが開発されています。「高速ビットカウントルーチン」を参照してください。
これはそこで提示されているアルゴリズムの1つです。彼らがNiftyParallelCountと呼んでいるもの:
#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 ;
}
これは、シングルロッドそろばんのようなもののように聞こえます。今、私はあなたのインタビュアーが誰であるか興味があります。