子集和问题的实例

时间:2011-09-15 15:12:52

标签: algorithm computer-science np-complete

我遇到的问题是子集求和问题的一个非常明确的例子:

“给定[-65000,65000]范围内的整数列表,如果列表的任何子集总和等于零,则该函数返回true。否则返回False。”

我想问的更多的是解释而不是解决方案。

这是我在考虑问题的复杂性之前提出的特定于实例的解决方案。

  • 对数组A []进行排序,并在排序期间将每个元素与计数器'extSum'相加(O(NLogN))
  • 定义指针low = A [0]和high = A [n-1]
  • 以下是决定性代码:
  • while(A[low]<0){
      sum = extSum;
      if(extSum>0){
        while(sum - A[high] < sum){
            tmp = sum - A[high];
            if(tmp==0) return true;
            else if(tmp > 0){
                sum = tmp;
                high--;
            }
            else{
                high--;
            }
        }
        extSum -= A[low];
        low++;
        high = n - 1;
      }
      else{
        /* Symmetric code: switch low, high and the operation > and < */
      }
    }
    return false;
    

首先,这个解决方案是否正确?我做了一些测试,但我不确定......看起来太容易了...... 这个代码的时间复杂度是不是O(n ^ 2)?

我已经阅读过各种DP解决方案,我想了解的是,对于我所面临的问题的具体实例,它们比这个天真直观的解决方案要好得多。我知道我的方法可以得到很大的改善,但是当谈到时间复杂性时,没什么可以产生很大的不同......

感谢您的澄清

编辑:一个明显的优化是,在排序时,如果找到0,则该函数立即返回true ....但它仅适用于其中有0的特定情况数组。

1 个答案:

答案 0 :(得分:-1)

嗯,我认为{0}会胜过你的答案。

因为它会简单地忽略while并返回false。