【分治】寻找主元素的3种算法

寻找主元素的3种算法

定义:如果一个元素的出现次数超过了数组长度的一半,这个元素就叫做主元素

寻找主元素 的算法有3种。
第一种,编程之美上的,O(n)的,没什么好说的。

第二种,如果我们将数组排序,排序以后,中间的那个数,一定是主元素。也就是说,数组的中位数就是主元素。
寻找数组里的第k大,有O(n)的算法。

第三种,分治法。
分治是递归的一种思路,先假定子问题可以解决,然后物尽其用,尽最大努力利用子问题的答案来解决原问题。
假设数组a的长度是n,令m=n/2,那么,考虑它的两个子问题:寻找a[1..m],和a[m+1..n]的主元素。
假设我们已经知道了这两个子问题的答案了,就是k和p,然后我们现在要解决原问题。
考虑一下,子问题的答案跟原问题的答案有些什么关系呢?
其中一个关系就是,原数组的主元素,必定是k或者p。你看,子问题的解和原问题的解产生了联系了!
有了这个结论,我们就可以,把整个a扫描一次,看看k和p出现的次数哪一个大,大的那一个,就是a的主元素了。
复杂度为 T(n) = 2 * T(n/2) + O(n) 也就是O(nlogn)

转载于:https://my.oschina.net/mustang/blog/85993

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是分治算法主元素Python代码实现: ```python def majority_element(nums): """ 分治算法主元素 :param nums: 数组 :return: 主元素 """ def majority_element_rec(lo, hi): # 当只有一个元素时,该元素即为主元素 if lo == hi: return nums[lo] # 分治:分别求左半部分和右半部分的主元素 mid = (hi - lo) // 2 + lo left_majority = majority_element_rec(lo, mid) right_majority = majority_element_rec(mid + 1, hi) # 如果左右半部分的主元素相同,则该元素即为整个数组的主元素 if left_majority == right_majority: return left_majority # 如果左右半部分的主元素不同,则需要统计两个主元素在整个数组中出现的次数,从而确定整个数组的主元素 left_count = sum(1 for i in range(lo, hi + 1) if nums[i] == left_majority) right_count = sum(1 for i in range(lo, hi + 1) if nums[i] == right_majority) return left_majority if left_count > right_count else right_majority return majority_element_rec(0, len(nums) - 1) ``` 其中,`majority_element_rec`是递归函数,用于求解子数组的主元素。具体地,该函数首先递归地求解左半部分和右半部分的主元素,然后再根据左右半部分的主元素是否相同,分别统计左右半部分主元素在整个数组中出现的次数,从而确定整个数组的主元素。最后,`majority_element`函数调用`majority_element_rec`函数,并将数组的起始和终止位置作为参数传入。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值