这个伪代码的Big-O是什么?我也需要一个正确的解释

时间:2017-04-26 13:46:22

标签: java algorithm big-o pseudocode

这是我想要计算时间复杂度的伪代码,我认为它是一个二进制搜索算法,但我在计算复杂性时失败,因为它正在减少logarithamic。

   USE variables half-array,found,middle element
   SET half-array=initial array;
   SET found=True;

 Boolean SearchArray(half-array)

   find middle element in half-array;
   Compare search key with middle element;
   IF middle element==search key THEN
           SET found=True;
   ELSE
        IF search key< middle element THEN
          SET half-array=lower half of initial array;
        ELSE
          SET half-array=upper half of initial array;


 SearchArray(half-array)

3 个答案:

答案 0 :(得分:3)

看起来你正在以递归方式运行这个方法,并且每次迭代都会减少被搜索的元素数量的一半。这将是一个对数减少,即 O(log n)

由于每次将元素减少一半,因此需要确定将其减少到单个元素所需的执行次数,this previous answer提供证据或者您是一个更直观的人,您可以使用this response中的以下图表:

enter image description here

答案 1 :(得分:0)

是的,它确实是一个二进制搜索算法。它被称为'二进制'搜索的原因是因为,如果您注意到,在每次迭代后,您的问题空间减少了大约一半(我说大致是因为地板功能)。 现在,为了找到复杂性,我们必须设计一个递归关系,我们可以用它来确定二进制搜索的最坏情况时间复杂度。

设T(n)表示二元搜索对n个元素进行的比较次数。在最坏的情况下,没有找到元素。另外,为了使我们的分析更容易,假设n是2的幂。

二进制搜索:

  1. 当只有一个元素时,只有一个支票,因此T(1)= 1。

  2. 计算中间条目然后将其与我们的密钥进行比较。如果它等于密钥,它返回索引,否则它通过更新上限和下限使得n / 2个元素所在的范围减半。范围。

  3. 然后我们只检查两半中的一半,这是递归完成的,直到剩下一个元素。

  4. 因此,我们得到了递归关系:

    T(n)= T(n / 2)+ 1

    使用主定理,我们得到时间复杂度 T(n)∈Θ(log n)

    另请参阅:Master Theorem

答案 2 :(得分:0)

你说这个算法是二进制搜索是正确的(将你的伪代码与这个维基百科页面上的伪代码进行比较:Binary Search

在这种情况下,该算法的最坏情况时间复杂度为O(log n),其中n是给定数组中元素的数量。这是因为在每次递归调用中,如果找不到目标元素,则将数组分成两半。

此缩减过程是对数的,因为在此算法结束时,您将通过将仍需要检查的元素数除以2将列表缩减为单个元素 - 您执行此操作的次数大致为相当于(见下文)你必须自己乘以2以获得一个等于给定数组大小的数字的次数。

*我说上面的大致因为递归调用的数量总是一个整数值,而你必须提高2的功率将不是一个整数,如果大小给定的列表不是2的幂。