[インタビュー] 配列内の数値の半分以上を見つける - ムーアの投票アルゴリズム

ムーア投票アルゴリズム

アイデア

このアルゴリズムは、まず配列の最初の要素を候補モードとして取得し、初期カウントを 1 に設定します。次に、配列内の各要素を反復処理し、現在の要素が候補モードと等しい場合はカウントをインクリメントし、そうでない場合はカウントをデクリメントします。カウントが 0 になると、アルゴリズムは候補モードを現在の要素に置き換え、カウントをリセットします。最終的には、候補モードは半分を超える数になります。

原理

このアルゴリズムが機能するのは、ほとんどの要素の出現数が他のすべての要素の出現の合計を超える必要があるためです。さまざまな要素を継続的に打ち消していくと、最終候補モードが多数派要素になります。

C++の実装

#include <iostream>
#include <vector>

int findMajorityElement(std::vector<int>& nums) {
    
    
    int majority = nums[0];  // 候选的众数
    int count = 1;           // 候选众数的计数

    for (int i = 1; i < nums.size(); ++i) {
    
    
        if (nums[i] == majority) {
    
    
            // 如果当前元素等于候选众数,则增加计数
            ++count;
        } else {
    
    
            // 如果当前元素不等于候选众数,则减少计数
            --count;
            if (count == 0) {
    
    
                // 当计数降为0时,更换候选众数为当前元素
                majority = nums[i];
                count = 1;
            }
        }
    }

    // 最终的候选众数即为超过一半的数
    return majority;
}

int main() {
    
    
    std::vector<int> nums = {
    
    2, 2, 1, 1, 1, 2, 2};
    int majorityElement = findMajorityElement(nums);
    std::cout << "Majority Element: " << majorityElement << std::endl;
    return 0;
}

複雑さ

ムーアの投票アルゴリズムの時間計算量は O(n) (n は配列の長さ) です。これは、配列を 1 回走査するだけで済むためです。これにより、大規模なデータ セット内のほとんどの要素を効率的に見つけることができます。

おすすめ

転載: blog.csdn.net/weixin_36313227/article/details/133270790