代码之家  ›  专栏  ›  技术社区  ›  Alex

如何查找多集(允许重复的集)的所有分区

  •  2
  • Alex  · 技术社区  · 6 年前

    给定可能包含重复项的数字集合,查找其中的所有分区(划分集合的所有可能方式。)

    分区1={1},{1},{2} 分区3={1,1},{2}

    How to find all partitions of a set 但在这个问题上,所有的数字都是不同的。

    集合分区的定义: https://en.wikipedia.org/wiki/Partition_of_a_set

    多重集的定义 https://en.wikipedia.org/wiki/Multiset

    如果您能用任何通用编程语言编写解决方案并加以解释,我们将不胜感激。


    更新

    似乎很多人都不知道这个问题是关于什么的。它是 请求给定集合的所有可能子集。相反,它要求你找出划分给定数字集合的所有不同方法。

    1 回复  |  直到 6 年前
        1
  •  2
  •   lrnv    4 年前

    嘿,我有一个python解决方案:

    from sympy.utilities.iterables import multiset_partitions
    from pi in multiset_partitions([1,1,3]):
        print pi
    

    查看代码,您可以在Knuth的AOCP中找到算法,就在那里: http://www.cs.utsa.edu/~wagner/knuth/fasc3b.pdf

    算法M,第39/40页。

    干杯:)

        2
  •  -3
  •   Himanshu Kansal    5 年前

    这是一个 问题

    回溯 递归

    void solve (set<vector<vector<int>>>& solution, vector<int> inputSet, 
    vector<vector<int>>& partitions, vector<int> partition, int n, int i) {
        int numberOfElements = 0;
        for (int i=0; i<partitions.size(); i++) {
            numberOfElements += partitions[i].size();
        }
        if (numberOfElements == n) {
            vector<vector<int>> newPartitions = partitions;
            for (int i=0; i<newPartitions.size(); i++) {
                sort (newPartitions[i].begin(), newPartitions[i].end());
            }
            sort(newPartitions.begin(), newPartitions.end());
            solution.insert(newPartitions);
            return;  
        }
        for (int j=i; j<n; j++) {
            partition.push_back(inputSet[j]);
            partitions.push_back(partition);
            vector<int> partitionNew;
            solve(solution, inputSet, partitions, partitionNew, n, j+1);
            partitions.pop_back();
        }
    }
    
    void permute (set<vector<vector<int>>>& solution, vector<int>& inputSet, int i, int n) {
        if (i == n) {
            vector<int> partition;
            vector<vector<int>> partitions;
            solve(solution, inputSet, partitions, partition, inputSet.size(), 0);
            return;
        }
        for (int j=i; j<=n; j++) {
            swap(inputSet[i], inputSet[j]);
            permute(solution, inputSet, i+1, n);
            swap(inputSet[i], inputSet[j]);
        }
    }
    

    以下是工作示例: Generate all Partitions