寻找出现频率超过一半的数

简介:

以前看到过这个面试题,可惜真面试时忘了。不过知不知道也没区别,因为本来也不知道解法,囧。。

题目:

有一个数组存放int型整数,数字有重复,且有一数字出现的频率超过了50%,请找出这个数字。

分析:

问了下数据量,10000的长度,数字的大小也在10000之内,数据也是乱序的。= =,估计他也没想到我会这么问,随口说的。听了这个数据范围,最先想到的就是排序+扫描,和直接标记法。

当然,这肯定不是好的方法,虽然在上述范围内可以解决,其实这个题目可以转化为另一个问题:求这个数组的中位数。至于为什么,想一下就知道。反正我当时没想到。。- -。

排序解法:

首先,对数组进行排序。10000的数据量,快排没问题。然后,直接扫描排序后的数组,找出出现频率超过50%的那个数字。扫描一遍即可。

整个算法复杂度是 O(nlogn)+O(n),完全可以胜任10000的数据量。

一点点优化:

上面说了,其实就是这就是求这个数组的中位数。所以直接输出Array[n/2]即可。这样的话,复杂度就是 O(nlogn)+O(1)。这个优化能让后面的 O(n) 变成 O(1) 。

不过,因为前面的  O(nlogn) 才是大头,所以并不是那么有成效,二者的总体复杂度还是会估计成 O(nlogn)。但无论是简洁程度还是代码量上都好很多。

标记法:

其实,这个也可以认为是一种Hash,只是因为数值小于10000,直接作为下标来Hash就可以了。在Hash的时候,计数一下,超过一半的就是要找的值。这个复杂度是 O(N) 。

如果说,数值很大,那也可用个Hash啊什么的,本质上一样,复杂度也是 O(N) 。其实也可以搞个二叉树嘛,不过复杂度要大一些了,复杂度是 O(nlogn) ,类似快排的复杂度。

以上两种,是我看到这个题目时,最先想到的思路,后面的是我后来查的网上的。

快速选择算法

这个算法和快速排序差不多,复杂度上要好些,最好情况是 O(n) 。其实就是把查找第K个值放到了快排里面,优化了一下。挺不错的算法。

其主要思想就是在快速排序中得到划分结果之后,判断要求的第k个数是在划分结果的左边还是右边,然后只处理对应的那一部分,从而达到降低复杂度的效果。

假设数组为S,先选取一个数作为基准比较数(作者称为“枢纽元”,即pivot),用快排方法把数据分为两部分Sa和Sb。

  • 如果k<= |Sa|( |Sa|表示Sa的大小),则对Sa部分用同样的方法继续操作;
  • 如果k= |Sa| + 1,这个pivot就是第k大值;
  • 如果k> |Sa| + 1,则对Sb部分用同样的方法查找第(k- |Sa|-1)大的值;

与快排不同,快排每次都要对划分后的两部分数据都继续进行同样的快排操作,快速选择不同,只对其中一部分进行操作即可。因为只选择一边进行递归,所以复杂度是 O(n) ,比快排要好,但是两者在最坏情况下的时间复杂度均为 O(n^2) ,出现在每次划分之后左右总有一边为空的情况下。

BFPRT算法

BFPRT算法,又称为中位数的中位数算法,由5位大牛(Blum 、 Floyd 、 Pratt 、 Rivest 、 Tarjan)提出,并以他们的名字命名。参考维基上的介绍Median of medians。这个,我就完全不知道了,最坏情况下 O(n) 复杂度的算法。又看到Floyd,Tarjan的名字了,orz。

算法的思想是修改快速选择算法的主元选取方法,提高算法在最坏情况下的时间复杂度。其主要步骤为:

  1. 首先把数组按5个数为一组进行分组,最后不足5个的忽略。对每组数进行排序(如插入排序)求取其中位数。
  2. 把上一步的所有中位数移到数组的前面,对这些中位数递归调用BFPRT算法求得他们的中位数。
  3. 将上一步得到的中位数作为划分的主元进行整个数组的划分。
  4. 判断第k个数在划分结果的左边、右边还是恰好是划分结果本身,前两者递归处理,后者直接返回答案。

首先看算法的主程序,代码如下。小于5个数的情况直接处理返回答案。否则每5个进行求取中位数并放到数组前面,递归调用自身求取中位数的中位数,然后用中位数作为主元进行划分。

总结:

总的来说,算法复杂度可以达到 O(n) ,如果使用快速选择算法,耍贱点就是Hash算法(略大的空间复杂度)。挫一点的话就是快排,复杂度也在 O(nlogn),足以抗100万级别的数据量了,一般比赛的时候基本能混过去(b_d),除非遭遇变态强的数据。最后那个神算法真不知道。

回过头看这些算法,除了Hash外,别的算法基本都和快排有着关联,真是佩服快排的发明者。

转载请注明:旅途@KryptosX » 寻找出现频率超过一半的数

目录
相关文章
|
Web App开发 缓存 安全
电脑屏幕上的广告太多怎么解决?
安装一个广告拦截扩展或软件,如AdBlock Plus、uBlock Origin等。这些工具可以帮助拦截网页广告,在浏览器的扩展商店中搜索并添加这些扩展。例如,在Chrome中,你可以访问Chrome网上应用店来安装。
1235 0
|
8月前
|
存储 弹性计算 网络协议
阿里云服务器ECS购买流程,一张图看懂,2026年最新版指南
2026最新阿里云ECS购买指南:一张图详解自定义购机全流程——涵盖付费类型(包年包月/按量/抢占式)、地域与可用区、实例规格族、操作系统镜像、系统盘/数据盘、公网带宽(固定/流量)、安全组、弹性网卡、IPv6及高级配置等,助您快速下单部署。
788 1
|
10月前
|
JSON 供应链 API
淘宝图片搜索商品API指南
淘宝图片搜索商品API基于图像识别技术,支持上传图片查找同款商品,返回标题、价格、销量等信息,适用于比价、找同款等场景。支持多维度筛选,采用HTTP POST请求与签名认证,响应格式为JSON,提升电商购物体验。
|
9月前
|
运维 监控 安全
阿里云服务器搭建新手手册:环境搭建、安全加固,到日常监控、故障处理指南
日常管理阿里云服务器时发现,多数用户在服务器上线后,常因缺乏系统的运维知识,陷入“环境配置混乱”“故障排查无思路”“安全防护缺失”等困境。阿里云服务器的稳定运行,并非仅依赖购买时的配置选型,更在于后期规范的运维管理——从基础环境搭建、安全加固,到日常监控、故障处理,每一个环节都直接影响业务连续性。本文结合2026年阿里云服务器最新特性、实测运维经验及行业最佳实践,从环境部署、安全防护、日常监控、故障排查、性能优化五个核心维度,用通俗技术语言拆解运维全流程。全程无营销表述,通过表格梳理关键操作与问题解决方案,提供可直接落地的实操技巧,帮助运维人员及服务器使用者建立系统的运维思维,保障服务器长期稳
747 4
|
9月前
|
人工智能 自然语言处理 监控
解密 AI agent 指挥官与智能体协作的协同体系
AI agent 指挥官 作为多智能体系统中的核心控制单元,承担着目标解析、任务规划、协作编排与执行策略调整等关键职责。本文结合阿里云函数计算、工作流服务、向量检索与模型服务体系,从工程实践视角出发,系统解析 AI agent 指挥官如何与智能体协同工作,构建可扩展、可观测、可演进的企业级智能体系统。
449 1
|
9月前
|
存储 弹性计算 安全
2026年阿里云热门活动:云资源产品直降,38元轻量,99元ECS续费同价,组合套餐一键购买
2026年阿里云推出“云资源产品直降”活动,覆盖个人开发者至企业用户,提供38元轻量服务器、99元ECS固定配置及u2a实例2.5折等优惠。活动涵盖建站、测试、生产全场景,通过“组合GO”方案与免费试用降低技术门槛。核心产品包括ECS 99/199套餐、大模型服务平台组合及u2a实例,满足企业官网、数据分析等需求。新客户可领满减券,高校学生享300元无门槛金,实现成本极致优化。
857 3
|
9月前
|
机器学习/深度学习 人工智能 Cloud Native
在2026这个AI元年中,如何构建于云上的“智能体”生态?
本文展望2026“AI元年”,指出AI将从工具升维为基础设施,核心单元由模型转向具备感知、规划、执行与学习能力的“智能体”。文章提出三大行动:重塑认知(运营智能体而非调用API)、重构技术栈(模型即基础设施,依托云平台)、重思应用(找准生态位)。强调云是智能体生态的操作系统与孵化器。(239字)
557 0
多返回值(Multiple Return Values)- 《Go语言实战指南》
Go 语言支持函数返回多个值,这一特性在实际开发中非常常见,尤其用于错误处理。本文介绍了多返回值的基本语法、用于错误处理的方式、返回值命名、忽略不需要的返回值以及实际应用场景。通过计算商和余数、文件操作、网络响应等示例,展示了多返回值的灵活性。最后总结了使用建议,包括搭配 `error` 实现显式错误控制、命名返回值提升可读性以及用 `_` 忽略无用值等技巧。
467 19
|
SQL 数据可视化 数据挖掘
2025年热门报表工具大盘点!助力企业快速建立数据管理中心!
2025年热门报表工具大盘点!助力企业快速建立数据管理中心!
|
消息中间件 存储 Java
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——ActiveMQ安装
本教程介绍ActiveMQ的安装与基本使用。首先从官网下载apache-activemq-5.15.3版本,解压后即可完成安装,非常便捷。启动时进入解压目录下的bin文件夹,根据系统选择win32或win64,运行activemq.bat启动服务。通过浏览器访问`http://127.0.0.1:8161/admin/`可进入管理界面,默认用户名密码为admin/admin。ActiveMQ支持两种消息模式:点对点(Queue)和发布/订阅(Topic)。前者确保每条消息仅被一个消费者消费,后者允许多个消费者同时接收相同消息。
683 0
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——ActiveMQ安装