这是我想要计算时间复杂度的伪代码,我认为它是一个二进制搜索算法,但我在计算复杂性时失败,因为它正在减少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)
答案 0 :(得分:3)
看起来你正在以递归方式运行这个方法,并且每次迭代都会减少被搜索的元素数量的一半。这将是一个对数减少,即 O(log n)。
由于每次将元素减少一半,因此需要确定将其减少到单个元素所需的执行次数,this previous answer提供证据或者您是一个更直观的人,您可以使用this response中的以下图表:
答案 1 :(得分:0)
是的,它确实是一个二进制搜索算法。它被称为'二进制'搜索的原因是因为,如果您注意到,在每次迭代后,您的问题空间减少了大约一半(我说大致是因为地板功能)。 现在,为了找到复杂性,我们必须设计一个递归关系,我们可以用它来确定二进制搜索的最坏情况时间复杂度。
设T(n)表示二元搜索对n个元素进行的比较次数。在最坏的情况下,没有找到元素。另外,为了使我们的分析更容易,假设n是2的幂。
二进制搜索:
当只有一个元素时,只有一个支票,因此T(1)= 1。
计算中间条目然后将其与我们的密钥进行比较。如果它等于密钥,它返回索引,否则它通过更新上限和下限使得n / 2个元素所在的范围减半。范围。
然后我们只检查两半中的一半,这是递归完成的,直到剩下一个元素。
因此,我们得到了递归关系:
T(n)= T(n / 2)+ 1
使用主定理,我们得到时间复杂度 T(n)∈Θ(log n)
另请参阅:Master Theorem
答案 2 :(得分:0)
你说这个算法是二进制搜索是正确的(将你的伪代码与这个维基百科页面上的伪代码进行比较:Binary Search)
在这种情况下,该算法的最坏情况时间复杂度为O(log n),其中n是给定数组中元素的数量。这是因为在每次递归调用中,如果找不到目标元素,则将数组分成两半。
此缩减过程是对数的,因为在此算法结束时,您将通过将仍需要检查的元素数除以2将列表缩减为单个元素 - 您执行此操作的次数大致为相当于(见下文)你必须自己乘以2以获得一个等于给定数组大小的数字的次数。
*我说上面的大致因为递归调用的数量总是一个整数值,而你必须提高2的功率将不是一个整数,如果大小给定的列表不是2的幂。