0
我們可以使用位掩碼來有效地表示集合存在於有限(或至少索引)的域中,例如以表示car
中的字母,我們可以將其表示爲26位集合像這樣:將多重集表示爲位序列
abcdefghijklmnopqrstuvwxyz
10100000000000000100000000
但是當然這隻能代表在場,不重複 - carry
例如實際上有兩個r
S,而是一組不能代表。
multiset代表一個計數,而不僅僅是存在,所以我們可以計數重複,但是我不清楚這是否可以在邏輯上用一個數表示。
同事建議的一個想法是使用素數作爲我們的指數,並通過它的素因子分解來表示多重集。所以我們上面的情況會變成:
car = 2^1 * 3^0 * 5^1 * ... * 61^1 * ....
carry = 2^1 * 3^0 * 5^1 * ... * 61^2 * ... 97^1 * 101^0
這是一個很好的方式來表示multisets?是否有更好的這種概念的二元表示?
在這種情況下'k'是什麼?給定元素的最大數量?這似乎是不可取的,不是嗎? – dimo414
@ dimo414 k就我的答案而言可以是任何自然數。適當的值取決於預期的最大數量,儘管32位或64位對於幾乎任何數據集都是有效的並且綽綽有餘。也可以使用任意精度數字,使用動態內存分配或根據需要擴展數組。但是再一次,k很可能有一個非常合理的上限。 – delnan