[英]How to find the power set of a given set without using left shift bit?
我試圖弄清楚如何實現一種算法來找到給定集合的冪集,但我遇到了一些麻煩。 這些集合實際上是向量,所以例如我給了Set<char> set1{ 'a','b','c' };
我會做PowerSet(set1);
我會得到所有的集合,但如果我這樣做Set<char> set2{ 'a','b','c', 'd' };
我會做PowerSet(set2)
並且我會錯過其中的一些。
Set<Set<char>> PowerSet(const Set<char>& set1)
{
Set<Set<char>> result;
Set<char> temp;
result.insertElement({});
int card = set1.cardinality();
int powSize = pow(2, card);
for (int i = 0; i < powSize; ++i)
{
for (int j = 0; j < card; ++j)
{
if (i % static_cast<int> ((pow(2, j)) + 1))
{
temp.insertElement(set1[j]);
result.insertElement(temp);
}
}
temp.clear();
}
return result;
}
以供參考:
cardinality()
是我的 .h 中的一個函數,它返回集合的大小。insertElement()
將元素插入到集合中,而忽略重復項。temp.insertElement(s[j])
然后result.insertElement(temp)
的原因是因為result
是一set
set
,所以我需要創建一個臨時集合來插入元素,然后將其插入結果.clear()
是一個清空集合的函數。removeElem()
,它刪除指定的元素(如果它存在),否則它會忽略它。你的if
測試是無稽之談——它應該是這樣的
if ((i / static_cast<int>(pow(2,j))) % 2)
您還需要在內循環之后(就在 temp.clear() 之前)將 temp 的插入移動到 result 中。
通過這些更改,只要 pow(2, card) 不溢出int
就應該可以工作 - 在大多數機器上最多可達 card == 30 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.