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

Posted

技术标签:

【中文标题】搜索排序数组中出现次数超过一半的元素所需的最小比较【英文标题】:Minimum comparisons needed to search an element in sorted array with more than half occurrences 【发布时间】:2013-08-22 12:16:49 【问题描述】:

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

【问题讨论】:

二分搜索最坏的情况是O(log(n)),这通常是在这种情况下所做的 @crush 我认为这种情况使测试它变得容易得多...... 我想我不清楚what would be the worst case Complexity 仅指的是查找 2,而不是数组中的任何数字。如果只针对2,那就是O(1) @crush,我只是举个例子来说明,它是针对一般情况的 @VarunMalhotra 2 我的意思是,如果应用于一般情况,任何重复次数超过 n/2 次。那个场景是O(1)。对于数组中的任何其他数字,它基本上是O(log(n)) 【参考方案1】:

如果它们已排序

在这种情况下,您只需检查一个中间元素,如果事实是这样的话

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

保证

【讨论】:

怎么样?如果我们有 2,2,2,1,4,5,2,2,1 @VarunMalhotra 这不会是一个排序数组...这就是为什么MBo 突出显示了问题的那一部分。没有排序数组,无论如何都不能使用二分查找算法。 糟糕,我忘记了。所以这意味着我们只需要将要搜索的数字与该数组的中间元素进行比较? @VarunMalhotra 你了解二分搜索算法 - 它是如何运作的吗? @VarunMalhotra 二进制搜索算法从数组的n/2 位置开始搜索。因此,如果搜索词在数组中出现的次数超过了n/2 次,那么在数学上保证它是搜索检查的第一个词。这就是为什么在您的示例中搜索 2 时它是 O(1) 的原因。如果搜索 1711,则为 O(log(n))【参考方案2】:

这个问题可以有两种可能的解释。我会解释两者。

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

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

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

由于我们使用二分查找来查找左右子数组中的数字,所以上述算法的复杂度为O(log(n))

【讨论】:

以上是关于搜索排序数组中出现次数超过一半的元素所需的最小比较的主要内容,如果未能解决你的问题,请参考以下文章

如何找出数组中出现次数超过长度一半的元素

数组中出现次数超过数组长度一半的值

最少交换次数

一本通1186 出现次数超过一半的数(类似桶排序)

JZ39. 数组中出现次数超过一半的数字

剑指offer39-数组中出现次数超过一半的数字