如何设计时间复杂度为O(n log n)的搜索算法?

时间:2013-08-27 16:40:17

标签: algorithm time logarithm

  

描述一个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),那么正确的算法是什么?

3 个答案:

答案 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,我们就会得到总和(ix-i
  • i插入哈希表。

总运行时间 - O(n)