搜索排序数组中出现次数超过一半的元素所需的最小比较数
Minimum comparisons needed to search an element in sorted array with more than half occurrences
最近,我遇到了一个问题,要从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))
。
相关文章:
- C++ 如何比较n个排序的整数向量以找到互元素?
- 关于比较两个无序数组并删除 a[] 中可以在 b[] 中找到的元素的问题
- 比较 2 个向量并从第二个向量中删除在第一个 - c++ 中找不到的元素
- 如何在比较时更改集合元素的值(在 c++ 中)?
- 比较文本文件的元素
- 比较文本文件的元素
- 比较它们之间的元素并获取公共值的键
- 如何比较C++中向量的元素?
- 比较向量中的元素时所花费的时间呈指数级增长
- gtest 期望无序元素与自定义比较器/匹配器一起使用
- 用字符串 c++ 比较对向量的元素
- 如何与元素进行元素比较
- 字符指针对象和相应的字符数组元素比较
- 开发C++数组元素比较
- 快速矢量元素比较
- 使用下标运算符进行Integer Vector元素比较失败,但使用at函数成功
- 是否有可能判断哪个数组元素比较结果为真?
- 当>=用于元素比较时,插入排序比>慢,为什么?
- 如何在C++中逐元素比较相等的两个向量
- 简单的c++数组元素比较