用于查找具有给定总和的排序数组的子集的最有效算法

时间:2014-09-20 16:34:19

标签: arrays algorithm search big-o

所以我一直在阅读Finding three elements in an array whose sum is closest to a given numberFind a pair of elements from an array whose sum equals a given number这样的帖子,似乎几乎所有问题都针对成对或三胞胎。

我的问题是,给定一个排序数组,一个数字 n ,一个总和 S ,是否有一个"通用"通过检查并在数组中添加 n 数字来返回 S 的算法?我现在知道如何有效地进行对和三元组,但我似乎无法找到与 n> 3相关的算法

1 个答案:

答案 0 :(得分:0)

设MAX为数组的大小。考虑所有MAX数字的二进制数;让数字j的“1”表示“第j个数字包含在总和S中”,数字j的0表示不是。

然后有2 ^ MAX个可能的解决方案。您可以进行线性搜索。效率不高。

您可以改为修剪:

findSolution (Array, MAX, n, S, SolutionSoFar, j) is
  if SolutionSoFar has n digits set to 1
    if the sum it represents == S
       return SolutionSoFar -- we win
    else
       return false

  if (result = findSolution (Array, MAX, n, S, SolutionSoFar with jth set to 1, j+1))
     return result 
  else if (result = findSolution (Array, MAX, n, S, SolutionSoFar with jth set to 0, j+1))
     return result
  else
     return false


findSolution (Array, MAX, n, S, a binary number of MAX digits all 0's, 0)

O符号仍然会显示为指数,但它更好。

你现在可以把更多的智慧放到这里:扔出任何项目>的解决方案。 S-(n-1)(假设所有项目的大小至少为1)。喜欢添加接近平均值(S-(总和到目前为止))/(要添加的项目)的东西。

如果有一个比指数算法好的算法,或者如果我们能证明没有这个算法,就必须进一步思考。