搜索排序数组中出现次数超过一半的元素所需的最小比较数

Minimum comparisons needed to search an element in sorted array with more than half occurrences

本文关键字:元素 比较 一半 数组 排序 搜索      更新时间:2023-10-16

最近,我遇到了一个问题,要从n给定元素中搜索元素所需的最小比较,前提是它们是sorted,并且出现次数超过一半(n/2)。

例如,给定的排序数组为:1,1,2,2,2,2,2,7,11。此数组的大小为:9。我们需要找到找到2所需的最小比较(因为它的出现次数超过n/2次(5))。

这样做的最佳算法是什么?最坏的情况是什么?复杂性?

提供的选项有:

i) O(1)

ii)O(n)

iii)O(log(n))

iv)O(nlog(n))

只要它们是分类的

在这种情况下,你只需要检查一个中间元素,如果事实上

出现次数超过一半(n/2)

保证

这个问题可能有两种解释。两者我都解释。

首先,如果这个问题假设肯定有一个数字出现n/2或更多次,那么MBo的答案就足够了。

然而,如果有可能不存在出现n/2的元素,则复杂性为O(log(n))。我们不能仅仅检查n/2th元素。例如,在数组2, 4, 6, 6, 6, 8, 10中,中间元素是6,但它不会出现n/2或更多次。这种情况下的算法如下:

  • 选择中间元素(例如x
  • 使用二进制搜索(比如lIndex)在左侧子数组中查找x的索引
  • 使用二进制搜索(比如rIndex)在右侧子数组中查找x的索引
  • 如果是rIndex - lIndex >= n/2,则该数字出现n/2或更多次。否则,就不存在这样的数字

由于我们使用二进制搜索来查找左右子数组中的数字,因此上述算法的复杂度为O(log(n))