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