寻找多数元素的递归和迭代版本

本文探讨了寻找多数元素的有效算法,包括递归和迭代两种方法。通过对序列进行操作,确保多数元素在新序列中仍然占据多数,从而减少比较次数。递归算法通过去除不同元素后继续查找,而迭代算法则直接遍历序列计算每个元素出现的次数,最终找到多数元素。这两种方法都避免了平方级别的比较次数,提高了效率。
摘要由CSDN通过智能技术生成

多数元素定义:对于一组数,如果存在一个元素,该元素的个数大于n/2(向下取整),则该元素为多数元素。

采用蛮力方法是把每个元素和其他元素比较,并且对每个元素计数,但是这样的比较次数是n(n-1)/2=Θ(n的平方),这种方法的代价太昂贵。比较有效的算法是对这些元素进行排序,并且计算每个元素在序列中出现多少次。这在最坏的情况下的代价是Θ(n㏒n)。因为在最坏的情况下,排序这一步需要Ω(n㏒n)次比较。

还可以想到的一种方法是寻找中间元素,就是n/2(向上取整)。因为多数元素在排序的序列中一定是中间元素,可以扫描这个序列来测试中间元素是否为多数元素。由于中间元素可以在Θ(n)时间内找到,这个方法需要花费Θ(n)时间。

现在基于下面的观察结论,有一个很棒的算法,它的比较次数要少的多。

在原序列中去除两个不同的元素后,那么在原序列中的多数元素在新序列中还是多数元素。

由此可以得出寻找多数元素算法的递归版本,如下:

#include<stdio.h>
#include<stdlib.h>


int candidate(int p[],int m,int n){
    int j = m;
    int c = p[m];
    int count = 1;
    while( j <

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值