查找出现次数大于n/k的重复元素 ---非多重集算法

这篇博客总结了一篇关于查找出现次数大于n/k的重复元素的论文。从查找出现次数大于n/2的元素出发,通过非多重集算法进行分析,逐步扩展到查找出现次数大于n/k的元素。文章讨论了算法的细节,包括关键的变量和决策过程,并指出算法复杂度为O(n*k*log(k))。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文是对一篇英文论文的总结:Finding Repeated Elements。想看原文,请Google之。

这个问题的简单形式是“查找出现次数大于n/2的重复元素”。我们先从简单问题开始,然后再做扩展。

1.查找出现次数大于n/2的重复元素

  《编程之美》中有同样的一道题《寻找发帖水王》,具体思路是每次删除两个不同的元素,最后剩下的就是要求的元素。这个结论的证明如下:

  已知:n,m是正整数,n表示数组的长度,m是出现次数大于n/2的元素的个数,即m>n/2。

  需要求证的结论包括两个:

 (1)我们用v表示出现次数大于n/2的元素。当删除两个不同元素,且其中有一个元素是v时,则m减小1,同时n要减小2。

  求证:m-1>(n-2)/2    

  证明:m-1>n/2-1=(n-2)/2

 (2)当删除两个不同元素,且其中有一个元素不是v时,则只需要n减小2。

  求证:m>(n-2)/2 。这个结论是显然的。

代码如下:

int find(int array[], int n)
{
    int candidate;
    int count=0;
    for(int i=0;i<n;++i)
    {
        if(count==0)
        {
             candidate=array[i];count=1;
        }
        else
        {
             if(candidate==array[i])
                   ++count;
              else 
                   --count;   
        }       
    }  
    return c
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值