楼主:
dnol (舞秋风 忆白云)
2024-01-24 11:18:53各位大大好。后正在使用C开发一个算法。
后目前面临的问题是,
how to enumerate all k-bit combinations for a given mask.
比如说。我有一个mask。1100101。当k=2时。
我想要有效率的例举所有含有2个1的组合。如下。
0000101
0100001
1000001
0100100
1000100
1100000
我目前是用下面的code 产生出所有的sub-mask,但然跳掉k!=2的case。
for(unsigned sub_mask = (mask - 1) & mask; sub_mask;
sub_mask = (sub_mask - 1) & mask) {
if(__builtin_popcount(sub_mask) != k ) //k=2
continue;
...
}
请问有办法只iterate k=2的case吗?
作者:
Dracarys (MayShowGunMore)
2024-01-24 11:52:00直觉想到 std::next_permutation
作者:
oToToT (å±å©)
2024-01-24 11:55:00只是要功能的话应该可以写个递回函数枚举?
楼主:
dnol (舞秋风 忆白云)
2024-01-24 12:00:00我目前是用递回加上vector存起来需要的组合但我在寻求,是否有神奇的bit operation可达到我的需求
mask有限量的话,直接弄一个 map list 就好了
作者:
FRAXIS (喔喔)
2024-01-25 06:40:00Gosper's Hack 就是你要找的
作者:
ddavid (谎言接线生)
2024-01-25 10:01:00Gosper's Hack 跟这题差一步是摆到 mask 中为 1 的位数上,可以拿来取代我那篇的 generateCombinations,但还是需要最后填位置的步骤因为 Gosper's Hack 速度快的前提是每个 bit 都可以用,才能用他那套位元运算加速
作者:
expiate (夜露死苦)
2024-01-27 08:14:00用两个for loop 做 bit operation可以满足你的需求吗
楼主:
dnol (舞秋风 忆白云)
2024-02-01 10:17:00谢谢大家的建议,Gosper's Hack给了我一些启发,很有帮助