Is there the majority element in sequence A [1.. n]? If so, please find it out. An integer a in A is called the majority if it appears more than [n/2] times in A.寻找元素出现次数大于n/2
Time Complexity: Θ(n**2)
Time Complexity: Θ(nlogn)
Time Complexity: Θ(n)
Observation 5.1 If two different elements in the original sequence are removed, then the majority in the original sequence remains the majority in the new sequence.
-
初始化候选主要元素和计数器。将候选主要元素设为候选人序列中的第一个元素,计数器初始化为 0。
-
从序列的第二个元素开始遍历,对于每个元素执行以下操作:
- 如果当前元素与候选主要元素相同,则将计数器加 1。
- 如果计数器大于n/2,返回该候选主要元素。
-
关于候选人序列排序,
从位置 m 开始,初始化候选主要元素为 A[m],计数器为 1。
-
它开始向右遍历序列,直到遇到序列的末尾或计数器减为 0。在每一步中,它会检查当前元素与候选主要元素是否相同。如果相同,则计数器加 1;如果不同,则计数器减 1。这个过程中,如果计数器减为 0,就意味着从 m 到当前位置之间的元素中不存在主要元素,因此需要重新选择候选主要元素。
-
如果遍历到序列的末尾,说明候选主要元素出现的次数超过了序列长度的一半,那么就返回候选主要元素;否则,递归调用 candidate 过程,从当前位置的下一个位置开始重新选择候选主要元素。
Time Complexity: Θ(n)
第一阶段对序列进行遍历,对每个元素进行投票,候选主要元素的选取依赖于其出现的次数。第二阶段对候选主要元素进行验证,检查其出现次数是否超过了 n/2 次。
假设我们有一个序列 A = [1, 2, 2, 2, 3, 4, 5, 6]。
我们使用 Boyer-Moore 投票算法来找到主要元素。
首先,我们从序列的第一个元素开始,即 m = 1。初始化候选主要元素为 1,并将计数器 count 设为 1。
我们从第一个元素开始向右遍历序列:
- 对于元素 A[1] = 1,与候选主要元素相同,因此计数器加 1。
- 对于元素 A[2] = 2,与候选主要元素不同,因此计数器减 1。现在计数器为 0,我们需要重新选择候选主要元素。所以,我们更新候选主要元素为 A[2] = 2,并将计数器重置为 1。
- 对于元素 A[3] = 2,与候选主要元素相同,计数器加 1。
- 对于元素 A[4] = 2,与候选主要元素相同,计数器加 1。
- 对于元素 A[5] = 3,与候选主要元素不同,计数器减 1。现在计数器为 1。
- 对于元素 A[6] = 4,与候选主要元素不同,计数器减 1。现在计数器为 0,我们需要重新选择候选主要元素。所以,我们更新候选主要元素为 A[6] = 4,并将计数器重置为 1。
- 对于元素 A[7] = 5,与候选主要元素不同,计数器减 1。现在计数器为 0,我们需要重新选择候选主要元素。所以,我们更新候选主要元素为 A[7] = 5,并将计数器重置为 1。
- 对于元素 A[8] = 6,与候选主要元素不同,计数器减 1。现在计数器为 0,我们需要重新选择候选主要元素。所以,我们更新候选主要元素为 A[8] = 6,并将计数器重置为 1。
现在,我们遍历完整个序列,并且计数器不为 0。所以我们需要再次遍历序列来验证候选主要元素。
候选主要元素为 6,出现次数为 1。由于 1 并未超过序列长度的一半,所以最终的返回结果是 "none",表示序列中不存在主要元素。