四重组合时间复杂度

时间:2017-02-17 21:55:25

标签: algorithm time-complexity big-o dynamic-programming

我遇到了这个问题:给定一个数字数组arr和一个数字S,在arr中找到4个不同的数字,总计为S.

解决方案是:

function findArrayQuadCombination(arr, S):
   if (arr == null OR S == null):
      return null
   n = length(arr)
   if (n < 4):
      return null
   # hashing implementation language dependent:
   pairHash = new HashTable()
   for i from 0 to n-1
      for j from i+1 to n-1
         if !pairHash.isMapped(arr[i]+arr[j]):
            pairHash.map(arr[i]+arr[j], [])
         pairHash.get(arr[i]+arr[j]).push([i, j])

   for pairSum in pairHash.getKeys()
      if pairHash.isMapped(S - pairSum):
         pairsA = pairHash.get(pairSum)
         pairsB = pairHash.get(S - pairsSum)
         combination = find4Uniques(pairsA, pairsB)
         if (combination != null):
            return combination
   return null

# Helper function.
# Gets 2 arrays of sub-arrays of 2 numbers
# Gets 4 unique numbers, from 2 sub-arrays of different arrays
function find4Uniques(A, B):
   lenA = length(A)
   lenB = length(B)
   for i from 0 to lenA-1:
      for j from 0 to lenB-1:
         if ( A[i][0] == B[j][0] OR A[i][1] == B[j][1] OR
              A[i][0] == B[j][1] OR A[i][1] == B[j][0] ):
            continue
         else:
            return [A[i][0], A[i][1], B[j][0], B[j][1]]
   return null

解决方案说它是O(n ^ 2),但我不同意。

find4Uniques中的lenA和lenB的长度最多为n ^ 2,因此find4Uniques为O(n ^ 4) &#34; for pairSum in pairHash.getKeys()&#34; line是O(n ^ 2)因为可以有n ^ 2个不同的键。那么整个事情不应该是O(n ^ 6)吗?

2 个答案:

答案 0 :(得分:0)

对于复杂度为O(n^6),您给出的长度必须同时为真。此外,无法触发最终循环中的早期返回,并且考虑到总和组合的数学约束,长度将是可能的。

问题在于长度是相互依赖的。

如果你有n^2个密钥,它们的值现在只能有1个长度,因为每个对都需要求和一个不同的值。

如果列表的长度为n^2,那么所有对将总和为一个值,因此现在只有一个键。

如果lenAlenB都是n^2,那么您将从find4Uniques获得至少一个组合的非空返回,退出整个算法,因此它也不能运行n^2次。

要显示时间复杂度,您需要提供实际值arrS来提供这种复杂性。

答案 1 :(得分:0)

如果arr中的所有值都不同,那么find4Uniques将在内循环的3次迭代中返回一个值,如果B的大小为3+。这使得对find4Uniques的所有调用都超过了可以为A传入的数组大小的总和。 arr中元素对的数量是O(n^2)

但是,如果arr中的值不明显,那么它不需要表现良好。特别是如果S = 6arr = [0, 0, ..., 0, 1, 1, ..., 1, 4, 4,..., 4],则答案为null,但对于pairSum == 1,我们O(n^2)中的A值为[0, 1]看起来O(n^2) B个符合[1, 4]的{​​{1}}值看起来像O(n^4)并且arr会工作。

然而,只需首先重复:add[*] ⟨module⟩即可轻松解决此性能错误。