【发布时间】:2019-10-15 14:37:10
【问题描述】:
谁能解释一下如何计算二分查找复杂度以找到数组中的第二大数。
【问题讨论】:
-
数组是否允许包含重复项?
-
是的,该数组允许包含重复项
标签: time-complexity binary-search
谁能解释一下如何计算二分查找复杂度以找到数组中的第二大数。
【问题讨论】:
标签: time-complexity binary-search
二分查找是在一个有序数组上完成的。 如果您已经有一个排序数组,为什么还需要做任何事情呢?
数组中倒数第二个数字(按升序排序)将是第二大数字。(O(1))
如果数组包含重复项:
例如, {0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,... }
时间复杂度为 O(log n),其中 n 是数组中元素的数量。
最小的数字是索引 0 处的数字(称为 x),现在您可以使用二分搜索查找所有元素都等于 x 的数组边界。这些边界之外的直接邻居将是数组中的第二大数字。
如果你使用C++,可以使用this方法获取upper_bound。
【讨论】:
对具有任何给定属性的元素的二进制搜索始终是对数的,前提是您可以在恒定时间内确定该属性是否成立。
如果数组不能包含重复项,则不需要二进制搜索,并且复杂度是恒定的。
【讨论】:
在python中有效地做到这一点的一种方法是几乎在O(1)时间内将list[允许重复]转换为set[不允许重复],然后在O中再次获取索引[-2]处的项目(1) 时间,假设因为是二分查找,列表会按升序排序。
【讨论】: