【发布时间】:2013-08-27 16:40:16
【问题描述】:
描述一个 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),那么正确的算法是什么?
【问题讨论】:
-
尝试上课和上班。
-
首先,要在
O(nlogn)中完成您的任务,您必须使用具有该时间复杂度的排序算法(例如归并排序)。然后,您可以利用数组已排序的事实在O(n)中完成您的任务(想想如何,您不需要二进制搜索)。总体复杂度将是两种算法中最高的(因为它们是按顺序完成的),即O(nlogn)。