繁体   English   中英

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

[英]How to design a search algorithm with time complexity O(n log n)?

描述一个O(n log n)时间算法,给定一组Sn个整数和另一个整数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(n ^ 2)的插入排序开始,因此您已经失败了。

如果要用O(n log n)版本替换排序算法,则必须看看还剩下什么。 您有一个长度为n的单循环, 其中有一个调用二进制搜索的主体。 正确编码的二进制搜索为O(log n),因此结果应为O(n log n)。 将两个O(n log n)进程相加仍然会留下O(n log n)。

还有另一种更快的方法可以执行第二步,但我将留给您发现。 这不会影响整体结果。

正如其他答案所指出的那样,您可以首先使用O(n log n)排序,然后在每个元素O(log n)中搜索每个元素的补数,从而得出O(n log n) ) 总体。

但是,我认为您也可以执行以下操作来获得O(n)算法。

请注意,如果两个数字的总和为x,则其中一个必须>> x / 2,另一个必须为<= x / 2。 因此,用枢轴x / 2将数组分为两部分,一个更大,另一个更小。 这需要O(n)时间。 如果有多个元素的值x / 2,则操作完成。

现在为下部数组中的所有元素i生成xi的哈希表。 这又需要O(n)时间。

现在,在每次查询中以固定的时间搜索哈希表中高位数组中的每个元素。 因此,这也是O(n)。

因此,总体复杂度为O(n)。

对于每个元素i

  • 如果xi在哈希表中,我们有和( ixi
  • i插入哈希表。

总运行时间O(n)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM