[問題] 在一個給予的mask中,例舉所有k-bit 組合

看板C_and_CPP (C/C++)作者 (舞秋風 憶白雲)時間10月前 (2024/01/24 11:18), 10月前編輯推噓6(608)
留言14則, 8人參與, 9月前最新討論串1/3 (看更多)
各位大大好。後正在使用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嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 211.21.176.170 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1706066335.A.480.html ※ 編輯: dnol (211.21.176.170 臺灣), 01/24/2024 11:20:13

01/24 11:52, 10月前 , 1F
直覺想到 std::next_permutation
01/24 11:52, 1F

01/24 11:55, 10月前 , 2F
只是要功能的話應該可以寫個遞迴函數枚舉?
01/24 11:55, 2F

01/24 12:00, 10月前 , 3F
我目前是用遞迴加上vector存起來需要的組合
01/24 12:00, 3F

01/24 12:01, 10月前 , 4F
但我在尋求,是否有神奇的bit operation可達到我的需求
01/24 12:01, 4F

01/24 12:16, 10月前 , 5F
不是產生所有k=2的mask取AND?
01/24 12:16, 5F

01/24 13:15, 10月前 , 6F
mask有限量的話,直接弄一個 map list 就好了
01/24 13:15, 6F

01/25 06:40, 10月前 , 7F
Gosper's Hack 就是你要找的
01/25 06:40, 7F

01/25 10:01, 10月前 , 8F
Gosper's Hack 跟這題差一步是擺到 mask 中為 1 的位數上
01/25 10:01, 8F

01/25 10:03, 10月前 , 9F
,可以拿來取代我那篇的 generateCombinations,但還是需
01/25 10:03, 9F

01/25 10:03, 10月前 , 10F
要最後填位置的步驟
01/25 10:03, 10F

01/25 10:08, 10月前 , 11F
因為 Gosper's Hack 速度快的前提是每個 bit 都可以用,
01/25 10:08, 11F

01/25 10:09, 10月前 , 12F
才能用他那套位元運算加速
01/25 10:09, 12F

01/27 08:14, 10月前 , 13F
用兩個for loop 做 bit operation可以滿足你的需求嗎
01/27 08:14, 13F

02/01 10:17, 9月前 , 14F
謝謝大家的建議,Gosper's Hack給了我一些啟發,很有幫助
02/01 10:17, 14F
文章代碼(AID): #1bi86VI0 (C_and_CPP)
文章代碼(AID): #1bi86VI0 (C_and_CPP)