像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)
因此,二分搜索的时间复杂度为
log2 (n)