簡體   English   中英

如何在不使用左移位的情況下找到給定集合的冪集?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM