描述一个O(n log n)时间算法,给定 n 整数的 S 和另一个整数 x ,确定是否在 S 中存在两个元素,其总和正好是x。
我正计划使用二进制搜索。
ALGORITHM(S,x)
S=Insertion-Sort()
for i=1 to S.length
n=x-S[i]
if( Binary-Search(S,n) == true)
return { S[i],n }
Binary-Search(A, v)
low=1
high=A.length
while low ≤ high
mid=(low+high)/2
if v = A[mid]
return mid
if v > A[mid]
low ← mid+1
else
high ← mid−1
return NIL
如何找到此算法的时间复杂度?如果 T(n)不是(n log n),那么正确的算法是什么?
答案 0 :(得分:3)
算法的整体顺序由各个部分的最高顺序决定。您开始使用worst-case performance is O(n^2)插入排序,因此您已经失败了。
如果您要使用O(n log n)版本替换排序算法,那么您必须查看剩下的内容。您有一个长度 n 的循环,其中一个主体调用二进制搜索。正确编码的二进制搜索是O(log n),因此结果应为O(n log n)。添加两个O(n log n)进程仍然会留下O(n log n)。
有另一种更快的方法来完成第二步,但我会留下让你去发现。它不会影响整体结果。
答案 1 :(得分:0)
正如其他答案所指出的那样,你可以先使用O(n log n)排序,然后在每个元素的O(log n)时间内搜索每个元素的补码,从而加起来为O( n log n)整体。
但是,我认为您还可以执行以下操作来获得O(n)算法。
观察如果两个数之和为x,则其中一个必须是> = x / 2,而另一个<= x / 2。因此,通过枢轴x / 2将阵列分成两部分,一个更大,一个更小。这需要O(n)时间。如果有多个元素的值为x / 2,那么就完成了。
现在为较低数组中的所有元素x-i
构建一个i
哈希表。这需要再花费O(n)时间。
现在,在每次查找的恒定时间内,在哈希表中搜索高数组中的每个元素。因此,这也是O(n)。
因此,整体复杂性,O(n)。
答案 2 :(得分:0)
对于每个元素i
:
x-i
,我们就会得到总和(i
和x-i
)i
插入哈希表。总运行时间 - O(n)
。