如何删除特定数据集中的重复项?

时间:2017-12-02 22:30:56

标签: c++ algorithm c++11 time-complexity

假设我们有两个想要获得相同数字或硬币的孩子(硬币名称1,2,6,12)。孩子们不关心价值。 我想在两个孩子之间分享的排列的示例容器:

{1, 1, 1, 1, 1, 1},
{1, 1, 2, 2},
{1, 2, 1, 2},
{1, 2, 2, 1},
{2, 1, 1, 2},
{2, 1, 2, 1},
{2, 2, 1, 1}

现在我想拥有没有重复的集合:

child A     child B
2 2         1 1 
2 1         2 1 
1 1         2 2 
1 1 1       1 1 1 

这种排列是错误的:

1 2 1 2 
1 2 2 1 
2 1 1 2 

,因为

child A     child B
1 2         1 2 

的排列
child A     child B
2 1         2 1 

我们已经拥有。这些集合:1 2 2 12 1 1 2也是排列。

我的解决方案就在这里,对于那个特定的输入正常工作但是如果你添加更多具有不同名义的硬币,它就没有!

#include <iostream>
#include <vector>
#include <unordered_set>

using namespace std;

int main()
{
    vector<vector<int>> permutations = 
    {
        {1, 1, 1, 1, 1, 1},
        {1, 1, 2, 2},
        {1, 2, 1, 2},
        {1, 2, 2, 1},
        {2, 1, 1, 2},
        {2, 1, 2, 1},
        {2, 2, 1, 1}
    };
    vector<pair<unordered_multiset<int>, unordered_multiset<int>>> childSubsets;

    for(const auto &currentPermutation : permutations)
    {
            size_t currentPermutationSize = currentPermutation.size();
            size_t currentPermutationHalfSize = currentPermutationSize / 2;
            //left
            unordered_multiset<int> leftSet;

            for(int i=0;i<currentPermutationHalfSize;++i)
                leftSet.insert(currentPermutation[i]);

            bool leftSubsetExist = false;
            for(const auto &subset : childSubsets)
            {
                if(subset.first == leftSet)
                {
                    leftSubsetExist = true;
                    break;
                }
            }
            //right
            unordered_multiset<int> rightSet;

            for(int i = currentPermutationHalfSize; i < currentPermutationSize; ++i)
                rightSet.insert(currentPermutation[i]);

            bool rightSubsetExist = false;
            for(const auto &subset : childSubsets)
            {
                if(subset.second == rightSet)
                {
                    rightSubsetExist = true;
                    break;
                }
            }
            //summarize
            if(!leftSubsetExist || !rightSubsetExist) childSubsets.push_back({leftSet, rightSet});
    }
    cout << childSubsets.size() << endl;
}

如何更改解决方案以实现最佳且不太复杂?

1 个答案:

答案 0 :(得分:0)

你应该添加

if (leftSubsetExist) 
  continue;

在第一个周期后(作为优化)

你能加一些“错误的”排列(用另一枚硬币)吗?