[問題] 在一個給予的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