我认为Find two elements in an array that sum to k和How can I find two elements in an array that sum to k是相关的。
我知道一个O(n)解决方案,但我发现O(n logn)也存在: -
p=0,q=n-1;
while(p<q)
{
if(a[p]+a[q]==k)
{
cout<<a[p]<<"\t"<<a[q];
p++;
q--;
}
else if(a[p]+a[q]>k)
q--;
else
p++;
}
这需要首先对数组进行排序。但由于p和q的值取决于数组中的元素,我们如何断言该算法的复杂度为O(n Log n)?
答案 0 :(得分:1)
高效排序算法的复杂性为O(n log n)
。
无论p
和q
以何种方式发生变化,while
周期都会遍历数组中的所有元素一次,因此它的复杂性为O(n)
。
将两者加在一起:O(n log n) + O(n) = O(n log n + n) = O(n log n)
,因为当n log n
是一个很大的数字时,n远小于n
。
答案 1 :(得分:0)
如果你有一个O(n)
解决方案,除非O(n log n)
解决方案有O(n)
,否则你不需要关心O(n^(n^(n^n)))
一个,因为更糟,其他一些问题,如像O(n)
这样的大规模空间复杂性: - )
在任何情况下,您显示的算法也是O(n log n)
,因为您要么在每次迭代时增加低索引,要么降低高索引。
我怀疑你提到的{{1}}首先包含了一些初始未排序的数据,因为这是排序的典型时间复杂度。
答案 2 :(得分:0)
在python中
arr = [1, 2, 4, 6, 10]
diff_hash = {}
expected_sum = 3
for i in arr:
if diff_hash.has_key(i):
print i, diff_hash[i]
key = expected_sum - i
diff_hash[key] = i
ALGO:
Input: expected_sum
diff_hash = hashtable_datastructure
for(i=0, i<len(arr), i++)
{
if(diff_hash(arr[i]))
{
return arr[i] , diff_hash(arr[i])
}
key = expected_sum - arr[i]
diff_hash(key) = arr[i]
}