我遇到了这个问题:给定一个数字数组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)吗?答案 0 :(得分:0)
对于复杂度为O(n^6)
,您给出的长度必须同时为真。此外,无法触发最终循环中的早期返回,并且考虑到总和组合的数学约束,长度将是可能的。
问题在于长度是相互依赖的。
如果你有n^2
个密钥,它们的值现在只能有1个长度,因为每个对都需要求和一个不同的值。
如果列表的长度为n^2
,那么所有对将总和为一个值,因此现在只有一个键。
如果lenA
和lenB
都是n^2
,那么您将从find4Uniques
获得至少一个组合的非空返回,退出整个算法,因此它也不能运行n^2
次。
要显示时间复杂度,您需要提供实际值arr
和S
来提供这种复杂性。
答案 1 :(得分:0)
如果arr
中的所有值都不同,那么find4Uniques
将在内循环的3次迭代中返回一个值,如果B
的大小为3+。这使得对find4Uniques
的所有调用都超过了可以为A
传入的数组大小的总和。 arr
中元素对的数量是O(n^2)
。
但是,如果arr
中的值不明显,那么它不需要表现良好。特别是如果S = 6
和arr = [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⟩
即可轻松解决此性能错误。