[问题描述] Majority定义: 整形数组A[1...n]中的元素a, 其出现次数超过 ⌊n/2⌋.
这个问题应该是比较经典的问题, 我大概整理了一下几种常见的算法:
1. Brute-force ( O(N^2) )
这种方法比较直观, 将每个元素A[i]与其后面出现的元素A[i + 1...n]比较, 得到A[i]的出现次数C[i]. C[i]中如果有 > ⌊n/2⌋的元素, 那么元素 A[i]就是majority. 复杂度是O(N^2).
2. 排序 + 线性遍历 ( O(N*lgN) )
排序需要耗费O(N*lgN), 然后在已序的新数组上遍历一次找出满足条件的majority, 耗时O(N).
3. Median + 线性遍历 (O(N) ~ O(N^2))
不管n是奇数还是偶数, 如果存在majority K, 那么在已序的数组中, 其必然有占据 ⌊(n + 1)/2⌋这个位置.
⌊(n + 1)/2⌋这个位置的元素是属于median, 于是问题就转换为先求 median of A[1...n]. Selection算法如果采用median-of-medians的pivot选择法, 可以保证即使在worst-case情况下也能O(n) 时间求出median. 此处因为可能会出现大量元素相等的情况, 因此传统的partion方法可能会导致即使尽可能地选取最好的pivot, 也会导致每次partion及其不均衡, 从而导致复杂度及其靠近O(N^2). 通过改进partition的策略应该可以避免这种情况(2分转3分?).
随后得到这个元素K以后, 我们线性遍历A一次, 检查K出现的次数是否满足条件, 耗费时间O(N).
4. Majority Algorithm ( O(N) )
此算法我是在 <Algorithm Design Techniques and Analysis> 中看到的, 线性的. 该算法的关键思想源自以下这条定理:
如果元素 x 和 y是不同的元素, 那么移除这两个元素后得到的新数组B[1...n-2], 与A的majority是相等的.
有了这条定理, 我们就可以上代码啦:
MAJORITY Algorithm
Input: An array A[1...n] of n elements.
Output: The majority element if it exists:otherwise non.
1. c ← candidate(1)
2. cout ← 0;
3. for j ← 1 to n
4. if A[j] = c then count ← count + 1
5. end for
6. if count > ⌊n/2⌋ then return c
7. else return none
8.
9. Procedure candidate(m)
10. j ← m;c ← A[m];count ← 1
11. while j < n and count > 0
12. j ← j + 1
13. if A[j] = c then count ← count + 1
14. else count ← count - 1
15. end while
16. if j = n then return c
17. else return candidate(j + 1)
代码中有几个关键之处, 保证了程序的正确性.
1. 循环体(11-15): 假定c是majority. 如果 A[j] != c, 根据定理, 去除这两个元素后得到的新序列B, 其Majority依然是c. 但出现次数减一. 否则, 出现次数加一.
2. 第16行, 如果从m开始的扫描终止于序列最后一个元素, 则返回c. j = n 时, count的值 >= 0. 对于count > 0, 很容易理解, c在A[m...n]中出现的次数必然超过一半. 而count = 0, c出现的次数刚好一半. 对于A[1...m-1]里面的任何元素, 其出现次数必然<= 1 / 2. 因此, 只有count > 0时候, 返回的元素才是真正的majority. 此处 count = 0的返回, 仅仅是为了有一个序列内的candidate数值作为后续检查使用. 如果candidate返回有效的数组索引, 自然可以避免后续的检查.
3. 第17行, j < n. 这个时候, 根据count = 0, 可以得知, A[m...j]中的任何元素,除了c出现一半外, 其它元素出现均小于一半. 因此, 可能的candidate在A[j + 1...n]中必然超过一半.
分享到:
相关推荐
寻找多数元素。用递归算法MAJORITY实现多数的寻找,其中调用candidate(m)函数。
该压缩文件包含4个txt文件,可作为《算法导论》蒙特卡洛和分治法求解多数问题的测试数据,完整实现代码详见https://blog.csdn.net/baidu_40395808/article/details/136692274。每个txt中每行为一个数字,txt的所有行...
《K-majority聚类算法详解》 在数据挖掘与机器学习领域,聚类是一种重要的无监督学习方法,其中,K-means是最常见的聚类算法之一。然而,针对特定的数据类型和场景,K-means的欧式距离计算方式可能并不适用。于是,...
finding a majority among n votes.pdffinding a majority among n votes.pdffinding a majority among n votes.pdffinding a majority among n votes.pdfv
标题中的“Three-input-Majority-Voter”指的是一个三输入的多数表决逻辑电路,也被称为“三人表决器”。在电子工程和计算机科学中,这样的电路或系统被设计用来基于三个输入信号(通常代表三位用户的投票)来产生一...
用于处理标签噪声的matlab代码,label noise,集成学习
在计算机科学和数据分析领域,"主元素"(Majority Element)是一个重要的概念,尤其是在数据处理和算法设计中。主元素是指在给定的一组数字中出现次数超过数组长度一半的元素。如果存在这样的元素,那么它就是数组的...
例如,在一个序列中,`candidate` 函数会逐个检查元素,通过递归找到可能的多数元素,然后 `majority` 函数验证其是否满足多数元素条件。 总结: 寻找多数元素的算法是一种高效的方法,利用了多数元素的性质来减少...
在编程领域,寻找多数元素(Majority Element)是一项常见的任务,尤其在算法设计和数据处理中。多数元素指的是在一个整数数组中出现次数超过数组长度一半的元素。本主题将详细探讨如何用C++语言来解决这个问题。 ...
在这个例子中,`Counter(nums)`计算了数组中每个元素的频率,`majority_count`定义了多数元素的阈值,然后通过列表推导式找出所有计数超过这个阈值的元素。 对于求职面试来说,熟练掌握这类问题的解法是非常重要的...
C语言写的寻找大数元素算法 C语言写的寻找大数元素算法 C语言写的寻找大数元素算法
4. **处理类别不平衡问题**:在多数投票规则(Majority Rule)下,如果类别分布不均,可能会导致少数类别的样本被误分类。为解决这一问题,可以采取加权投票,将少数类的样本赋予更高的权重。 **2. Python实现KNN**...
本主题聚焦于一个特定类型的表决器——三输入多数表决器(Three-input Majority Voter)。这个电路设计通常用硬件描述语言(如VHDL)来实现,以满足特定的功能需求。 三人表决器,正如其名,具有三个输入(A、B、C...
本文提出结合majority和median的表决算法,问题得到较好改善:首先使用majority表决算法进行工作,当 出现无法表决的情况时,计算数据分散程度,如果小于某个设定安全阈值,则使用median表决算法来处理这种情况,若大于安全...
javascript js_leetcode题解之169-majority-element.js
课件中提到了几种使用递归和分治策略解决的经典问题,如归并排序(Mergesort)、两个数字的乘法(Multiplication of two numbers)、两个矩阵的乘法(Multiplication of two ...,以及多数问题(Majority problem)...
c c语言_leetcode题解之0229_majority_element_ii
java郑 java_leetcode题解之Online Majority Element In Subarray.java
python python_leetcode题解之229_Majority_Element_II.py
基于Majority逻辑门映射的电路面积优化