将顺序搜索与二进制搜索进行比较

时间:2014-06-09 10:27:45

标签: algorithm quicksort binary-search asymptotic-complexity linear-search

假设我有一个未排序的实数数组,长度为N。我想找到最大的非正数y,然后找到数组中小于x的第一个数字y,并且第一个数字z大于y }。

我想理论上将顺序搜索与二次搜索非渐近地(即不仅仅是用大的Os)进行比较以找到这些值。陈述是否合理:

  • 顺序搜索需要
    • 0进行排序比较,
    • 3*N搜索比较(三次连续搜索)。
  • 二进制搜索需要
    • 2*N*ln(N) ≈ 1.39*N*log_2(N)排序比较(quicksort, average) ,
    • 最多log_2(N)次搜索比较(只有一次搜索,因为数组已排序,因此我们可以查看排序数组中的相邻值,以便在找到xz之后找到y)。

因此,如果

,我可以说二进制搜索会更快
1.39*N*log_2(N) + log_2(N) < 3*N 
<=> 
0 < N < 3.44779

即。仅适用于极小的阵列?

2 个答案:

答案 0 :(得分:2)

是的,你的结论是正确的。但是,通常使用排序数组(或任何其他有组织的结构)的意义在于,只执行一次或很少执行预处理步骤 - 与频繁查询相反。经过多次查询后,预处理成本得到了回报。

答案 1 :(得分:1)

不,由于几个原因,这不是一个有效的结论。

  • 你只考虑比较的成本(这是次要的),而不是分支和掉期的成本。
  • 您使用的是quicksort执行的平均比较次数的近似值,这只是渐近有效。
  • 您使用“操作次数”作为“速度”的替身。实际处理器不需要花费一个恒定的时间来执行给定的操作,并且它们在过程上花费的总时间不是每个操作的执行时间的总和。