📜  二元搜索的复杂度分析

📅  最后修改于: 2021-05-08 18:32:37             🧑  作者: Mango

O(1)O(n)这样的复杂性很容易理解。 O(1)表示需要恒定的时间来执行操作,例如在字典中以恒定的时间到达元素; O(n)表示,它取决于n的值来执行操作,例如在数组中搜索元素的n个元素。

但是对于O(Log n) ,并不是那么简单。让我们在二进制搜索算法的帮助下对此进行讨论,该算法的复杂度为O(log n)

二进制搜索:通过将搜索间隔重复分成两半来搜索排序的数组。从覆盖整个数组的间隔开始。如果搜索键的值小于间隔中间的项目,则将间隔缩小到下半部分。否则,将其缩小到上半部分。重复检查,直到找到该值或间隔为空。

例子:

Sorted Array of 10 elements: 2, 5, 8, 12, 16, 23, 38, 56, 72, 91

Let us say we want to search for 23.

查找给定的元素:
现在找到23,将有很多迭代,每个迭代都有上图中提到的步骤:

  • 迭代1:
    Array: 2, 5, 8, 12, 16, 23, 38, 56, 72, 91
    • 选择中间元素。 (这里16 )
    • 由于23大于16,因此我们将数组分为两半,并考虑元素16之后的子数组。
    • 现在,此具有16个元素的子数组将被带入下一个迭代。
  • 迭代2:
    Array: 23, 38, 56, 72, 91
    • 选择中间元素。 (现在56 )
    • 由于23小于56,因此我们将数组分为两半,并考虑元素56之前的子数组。
    • 现在,此带有56之前的元素的子数组将被带入下一个迭代。
  • 迭代3:
    Array: 23, 38
    • 选择中间元素。 (现在23岁)
    • 由于23是中间元素。因此,迭代现在将停止。

    计算时间复杂度:

    • 假设二进制搜索的迭代在k次迭代后终止。在上面的示例中,它在3次迭代后终止,因此此处k = 3
    • 在每次迭代时,数组将被除以一半。假设任何迭代的数组长度为n
    • 迭代1处
      Length of array = n
    • 迭代2处
      Length of array = n⁄2
    • 迭代3处
      Length of array = (n⁄2)⁄2 = n⁄22
    • 因此,在迭代k之后
      Length of array = n⁄2k
    • 另外,我们知道
      After k divisions, the length of array becomes 1
    • 所以
      Length of array = n⁄2k = 1
      => n = 2k
      
    • 双方都应用日志函数:
      => log2 (n) = log2 (2k)
      => log2 (n) = k log2 (2)
      
    • (log a (a)= 1)
      所以,
      => k = log2 (n)
      

      因此,二分搜索的时间复杂度为