【问题标题】:Best performance approach to find all combinations of numbers from a given set(>80 elements) to reach a given final sum从给定集合(> 80 个元素)中找到所有数字组合以达到给定最终总和的最佳性能方法
【发布时间】:2018-10-16 01:26:05
【问题描述】:

在我被指示继续搜索而不是问这个一般性问题之前,请详细了解我的问题。 我们有在 pl sql 中执行此操作的算法。但是,当给定的数字集包含大量元素时,它的表现不佳。例如,当集合有大约 22 个元素时,它工作得很好。然而,在那之后表演就死了。 我们正在使用 oracle 数据库 12c,这种数字搜索组合是我们的一个应用程序的一部分,它从 oracle 表中提取到关联数组中以查找组合。示例所需的最终总和 = 30 从 {1,2,4,6,7,2,8,10,5} 等中选择的一组元素。

我的问题要点: pl sql 真的适合编写这样的算法吗?我们是否应该寻找另一种编程语言/技术/服务器容量/工具来处理超过 80 个元素的更大集合?

【问题讨论】:

  • 如果您能想出一种方法将您的数据分成 N 个组,其中 N 是您系统上的核心数,您也许可以使用支持多线程的语言来改善运行时间你的代码。例如,如果您可以将数据分成四个子集并在单独的线程中处理每个子集,那么四核处理器可能让您“足够快”地完成工作。 PL/SQL 不支持多线程。祝你好运。

标签: sql oracle performance plsql combinations


【解决方案1】:

Oracle 不适合解决这个问题,因为数据库不适合它。其实我觉得这个问题是一个NP完全问题,所以没有真正有效的解决方案。

数据库中的方法是生成达到一定大小的所有可能组合,然后过滤到与您的总和匹配的组合。这本质上是一个指数算法。可能有一些启发式算法可以接近解决问题,但这是一个固有的难题。

【讨论】:

    【解决方案2】:

    除非你能找到一些特殊的条件来缩小问题,否则你永远无法解决它。在您知道这个问题在理论上是可能的之前,不要担心语言实现。

    正如其他人所提到的,这个问题呈指数级增长。解决 22 个元素甚至 接近 解决 80 个元素。

    dynamic programming algorithm 可能能够快速找到子集和问题是否有一个解决方案。但是找到所有解决方案需要测试 2^80 组。

    2^80 = 1,208,925,819,614,629,174,706,176。那是 1.2e24。

    这是一个很大的数字。让我们做一个非常乐观的假设,一个处理器每秒可以测试十亿组。购买一百万个,大约 38 年你就能找到答案。也许有一天量子计算机可以更快地解决它。

    这可能有助于准确解释您要做什么。除非有一些特殊情况,有某种方法可以消除大部分处理并避免暴力解决,否则我看不到解决这个问题的任何希望。也许这是Theoretical Computer Science 网站的问题。

    【讨论】:

      猜你喜欢
      • 2021-06-19
      • 2010-09-06
      • 2011-06-05
      • 2021-01-02
      • 2016-12-08
      • 2019-05-24
      • 1970-01-01
      • 2018-03-16
      相关资源
      最近更新 更多