找到给定集合(> 80个元素)的所有数字组合以达到给定最终总和的最佳性能方法

时间:2018-05-05 20:43:39

标签: sql oracle performance plsql combinations

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

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

2 个答案:

答案 0 :(得分:3)

Oracle不适合解决此问题,因为数据库不适合它。事实上,我认为这个问题是NP完全问题,因此没有真正有效的解决方案。

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

答案 1 :(得分:0)

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

正如其他人所提到的,这个问题呈指数级增长。为22个元素求解它甚至不能关闭来解决它80。

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

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

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

这可能有助于准确解释您正在尝试做什么。除非有一些特殊条件,某些方法可以消除大部分处理并避免使用暴力解决方案,否则我认为没有任何希望解决这个问题。也许这是Theoretical Computer Science网站的问题。