改进子集解决方案

Posted

技术标签:

【中文标题】改进子集解决方案【英文标题】:Improving a subset solution 【发布时间】:2014-04-03 20:54:53 【问题描述】:

我有一个练习题,我有一个给定的值和一个给定的数字数组。我可以使用给定数组中的任何值一次来创建等于给定值的总和。

原来,我的算法会针对每个可能的组合遍历数组。后来我对其进行了优化,以检查当前总和是否大于该值。如果是,请停止尝试后面的组合,因为它们都将大于该值。

出于好奇,最好先计算所有总和然后对总和进行排序并进行二分搜索以找到具有相等值的总和吗?我想,对每一个总和进行比较会比只预先计算总和和结果要慢得多。

【问题讨论】:

您正在解决子集和问题,即 NP-Complete。试试这个:en.wikipedia.org/wiki/… 一旦找到答案,您就可以停止寻找。因此,迭代并检查您是否有答案会更有效。请记住,当您说“二分搜索”时,您隐含地假设数据必须进行排序。这比所有其他选项都贵。 嗯,我简单地提到过,我会计算总和的每个组合并对总和进行排序,这样就可以得到 BS。正在猜测该方法是否会比仅对每个级别进行比较更快(尽管要贵得多)。 您熟悉 Big-Oh 符号吗?我建议对每种方法在空间和时间方面进行 Big-Oh 分析。从长远来看,这是了解算法效率的好方法。您可能会发现您的所有方法都具有大致相同的算法复杂性,这意味着在大量输入集上进行平均,它们具有大致相同的效率和规模,就原始数组的大小而言,它们以相似的方式进行。跨度> 似乎在您忙于构建电源组时,如果结果存在,您就已经找到了结果...... 【参考方案1】:

计算所有总和,然后搜索等于所需值的总和会比简单的蛮力搜索更有效(及时)吗?

如果我们考虑不存在这样的集合的最坏情况,那么对于两种解决方案,您需要执行的加法操作的数量是相等的,因为您已经在计算解决方案中的每个总和,并且蛮力搜索最终会尝试每一种组合。

在您的解决方案中进行的比较次数会小于或等于使用蛮力进行的比较次数吗?是的。您绝对不需要先计算所有总和然后对结果进行排序:您可以在进行所有计算时简单地构建一个排序集。暴力破解最终会进行与组合一样多的比较,但构建所有总和的排序集合,然后对匹配值进行二进制搜索不应该是指数级的。

但话又说回来,您可能在构建电源组时已经找到了解决方案,所以我不确定它与简单的蛮力相比有何不同。它只是看起来像一个更昂贵的蛮力,因为现在你必须处理存储所有这些总和和其他中间计算,如果你选择这样做的话。

【讨论】:

以上是关于改进子集解决方案的主要内容,如果未能解决你的问题,请参考以下文章

优化分类基于matlab改进的人工蜂群算法优化SVM分类含Matlab源码 1833期

快速解决子集和

如何递归枚举添加到给定总和的所有子集?

子集和问题的这个变体更容易解决吗?

子集总和,带有回溯和类

leetcode-78-子集(用bfs解决)