如何有效地反转unsigned int x 中的 n 位?每个位必须随机挑选。它也必须只挑选一次。 x 与返回结果之间的汉明距离必须等于 n 。是否有O( n )解决方案?
// rnd_engine is kind of std::minstd_rand
template< typename rnd_engine >
unsigned int invert_bits( unsigned int x, unsigned int n, rnd_engine& rndEngine ) {
assert( n <= sizeof( x ) * 4 );
return // your ideas?
}
答案 0 :(得分:2)
我会执行以下操作:[将randInt(n+1)
替换为任何函数,在[0,n]
区间内返回一个随机整数。
mask
,其位数完全为n
:unsigned int mask = (1<<n)-1;
。这是O(1)
int i = 0; i<n; i++
,然后在i
中的rndEngine::randInt(i+1)
和mask
处交换位。这是O(n)
。return x ^ mask
。这会翻转mask
中设置的位;这是n
洗牌的比特。这是O(1)
。操作为O(n)
,假设randInt
(或其他)为O(1)
。