[问题] 在一个给予的mask中,例举所有k-bit 组合

楼主: 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可达到我的需求
作者: lycantrope (阿宽)   2024-01-24 12:16:00
不是产生所有k=2的mask取AND?
作者: stupid0319 (征女友)   2024-01-24 13:15:00
mask有限量的话,直接弄一个 map list 就好了
作者: FRAXIS (喔喔)   2024-01-25 06:40:00
Gosper's Hack 就是你要找的
作者: ddavid (谎言接线生)   2024-01-25 10:01:00
Gosper'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给了我一些启发,很有帮助

Links booklink

Contact Us: admin [ a t ] ucptt.com