【问题标题】:Combination Algorithm from multiple sets来自多个集合的组合算法
【发布时间】:2016-12-08 05:45:03
【问题描述】:

我正在尝试编写一个算法,告诉我可以使用来自多个值集的项目生成多少对。例如,我有以下集合: {1,2,3} {4,5} {6}

从这些集合中我可以生成 11 对: {1,4}, {1,5}, {1,6}, {2,4}, {2,5}, {2,6}, {3,4}, {3,5}, {3 ,6}, {4,6}, {5,6}

我写了以下算法:

int result=0;

for(int k=0;k<numberOfSets;k++){ //map is a list where I store all my sets
    int size1 = map.get(k);

    for(int l=k+1;l<numberOfSets;l++){
        int size2 = map.get(l);
        result += size1*size2;
    }
}

但正如您所见,该算法的可扩展性不是很强。如果集合的数量增加,算法开始表现很差。 我错过了什么吗?,有没有一种算法可以帮助我解决这个问题?我一直在寻找组合和排列算法,但我不太确定这是否是正确的路径。

非常感谢您

【问题讨论】:

  • 为什么不只存储每个集合中唯一元素的数量?那么它可能会提高你的表现。顺便说一句,您在寻找独特的配对吗?那么您的代码将无法正确输出对数。

标签: java algorithm combinations permutation


【解决方案1】:

首先,如果对中的顺序确实很重要,那么在内部循环中以int l=k+1 开头是错误的。例如。如果您认为它与{1,4} 相等,则您缺少{4,1},则结果正确,否则不正确。

其次,为了使事情进一步复杂化,您没有说这些对是否需要是唯一的。例如。 {1,2} , {2,3}, {4} 将生成 {2,4} 两次 - 如果您需要将其视为唯一,则您的代码结果不正确(您需要保留 Set&lt;Pair&lt;int,int&gt;&gt; 以删除重复项,您需要扫描这些集合并实际生成对)。

好消息:虽然仅计算对的次数不能超过 O(N2),但即使您有数千个集合,数百万个整数乘法/加法也很快在当今的计算机上足够了 - 例如Eigen deals quite well with O(N^3) operations 用于浮动乘法(请参阅矩阵乘法运算)。

【讨论】:

    【解决方案2】:

    假设你只关心对的数量,并且计算重复,那么有一个更有效的算法:

    我们将跟踪当前集合的数量,以及到目前为止我们遇到的元素数量。

    1. 从头到尾遍历列表
    2. 对于每个新集合,我们可以生成的新对数是集合的大小 * 遇到的元素的大小。将此添加到当前集数。
    3. 将新集合的大小添加到我们目前遇到的元素数量中。

    代码:

    int numberOfPairs=0;
    int elementsEncountered=0;
    
    for(int k = numberOfSets - 1 ; k >= 0 ; k--) { 
       int sizeOfCurrentSet = map.get(k);
       int numberOfNewPairs = sizeOfCurrentSet * elementsEncountered;
       numberOfPairs += numberOfNewPairs;
       elementsEncountered += sizeOfCurrentSet; 
    }
    

    要强调的关键点是,当我们计算每个集合贡献的新对的数量时,我们从哪个集合中选择第二个元素并不重要。也就是说,我们不需要跟踪我们已经分析过的任何集合。

    【讨论】:

      猜你喜欢
      • 2018-04-14
      • 2016-09-27
      • 2013-04-26
      • 1970-01-01
      • 1970-01-01
      • 2021-10-25
      • 1970-01-01
      • 1970-01-01
      • 2012-08-27
      相关资源
      最近更新 更多