搜索排序数组中元素超过一半的最小比较

时间:2013-08-22 12:16:50

标签: c++ c algorithm time-complexity

最近,我收到了一个问题,要求查找从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))

2 个答案:

答案 0 :(得分:11)

  

如果他们已经分类

在这种情况下,你必须只检查一个中间元素,如果是

  

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

保证

答案 1 :(得分: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))