像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)
- As (log a (a) = 1)
所以,=> k = log2 (n)
因此,二分搜索的时间复杂度为
log2 (n)
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。