Boyer-Moore 投票算法及其应用

2024-06-02 09:08
文章标签 算法 应用 投票 moore boyer

本文主要是介绍Boyer-Moore 投票算法及其应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1.什么是Boyer-Moore 投票算法,BM算法的应用在什么地方?

2.具体案例

3.参考


1.什么是Boyer-Moore 投票算法,BM算法的应用在什么地方?

        BM算法包括两个阶段,第一个阶段是投票阶段,第二个阶段是计数阶段

        投票阶段是从第一个数候选值开始,相同则c+=1,不同则c-=1,如果c为0,则替换候选值为新的候选值。

        统计阶段是对候选值进行验证,判断候选值是否符合条件,因为不是所有的候选值都符合条件。

        主要的应用场景:求解众数,寻找超过n/3的所有的数

2.具体案例

题目地址:https://leetcode-cn.com/problems/majority-element/

1.求解众数 要求时间复杂度O(n),空间复杂度O(1)  

代码如下

public static void main(String[] args) {
//        int[] arr = {1, 2, 3, 2, 2, 2, 5, 4, 2};int[] arr = {3, 3, 4};int num = majorityElement(arr);System.out.println("num:" + num);int num2 = majorityElement2(arr);System.out.println("num2:" + num2);}//Boyer-Moore 投票算法//应用求解众数//https://leetcode-cn.com/problems/majority-element/public static int majorityElement(int[] nums) {int candidate = nums[0];int count = 0;//投票阶段for (int i = 0; i < nums.length; i++) {if (candidate == nums[i]) {count++;continue;}if (count == 0) {candidate = nums[i];count = 1;continue;}count--;}//计数阶段int count2 = 0;for (int i = 0; i < nums.length; i++) {if (candidate == nums[i]) {count2++;if(count2>nums.length/2){return candidate;}}}return -1;}//使用hashmap计算众数public static int majorityElement2(int[] nums) {HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();for (int i = 0; i < nums.length; i++) {if (map.get(nums[i]) == null) {map.put(nums[i], 1);} else {map.put(nums[i], map.get(nums[i]) + 1);}}int key = -1;int count = -1;for (Map.Entry<Integer, Integer> entry : map.entrySet()) {if (entry.getValue() > count) {count = entry.getValue();key = entry.getKey();}}return key;}

题目地址:https://leetcode-cn.com/problems/majority-element-ii/

2.寻找超过n/3的数

代码如下

public static void main(String[] args) {int[] arr={1,1,1,3,3,2,2,2};List<Integer> list = majorityElement2(arr);System.out.println(list);}//ABBCBCAA//使用BM投票法//两个阶段 1.投票阶段 2.计数阶段// [A 1]  [A1  B1]  [A1  B2]  [A0  B1]  [A0  B2] [C1 B2] [C0 B1] [A1 B1]//https://leetcode-cn.com/problems/majority-element-ii/public static List<Integer> majorityElement2(int[] nums) {int num1 = nums[0];int count1 = 0;int num2 = nums[0];int count2 = 0;//投票阶段for (int i = 0; i < nums.length; i++) {if (num1 == nums[i]) {count1++;continue;}if (num2 == nums[i]) {count2++;continue;}if (count1 == 0) {num1 = nums[i];count1=1;continue;}if (count2 == 0) {num2 = nums[i];count2=1;continue;}count1--;count2--;}//计数阶段int count3 = 0;int count4 = 0;List<Integer> list=new ArrayList<>();for (int i = 0; i < nums.length; i++) {if (nums[i] == num1 ) {count3++;continue;}if (nums[i] == num2 ) {count4++;continue;}}if(count3>nums.length/3 ){list.add(num1);}if(count4>nums.length/3 ){list.add(num2);}return list;}

3.参考

1.https://zhuanlan.zhihu.com/p/76518429---BM算法

这篇关于Boyer-Moore 投票算法及其应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1023534

相关文章

Spring Boot Actuator应用监控与管理的详细步骤

《SpringBootActuator应用监控与管理的详细步骤》SpringBootActuator是SpringBoot的监控工具,提供健康检查、性能指标、日志管理等核心功能,支持自定义和扩展端... 目录一、 Spring Boot Actuator 概述二、 集成 Spring Boot Actuat

PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例

《PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例》词嵌入解决NLP维度灾难,捕捉语义关系,PyTorch的nn.Embedding模块提供灵活实现,支持参数配置、预训练及变长... 目录一、词嵌入(Word Embedding)简介为什么需要词嵌入?二、PyTorch中的nn.Em

Spring Boot3.0新特性全面解析与应用实战

《SpringBoot3.0新特性全面解析与应用实战》SpringBoot3.0作为Spring生态系统的一个重要里程碑,带来了众多令人兴奋的新特性和改进,本文将深入解析SpringBoot3.0的... 目录核心变化概览Java版本要求提升迁移至Jakarta EE重要新特性详解1. Native Ima

Redis中Stream详解及应用小结

《Redis中Stream详解及应用小结》RedisStreams是Redis5.0引入的新功能,提供了一种类似于传统消息队列的机制,但具有更高的灵活性和可扩展性,本文给大家介绍Redis中Strea... 目录1. Redis Stream 概述2. Redis Stream 的基本操作2.1. XADD

JSONArray在Java中的应用操作实例

《JSONArray在Java中的应用操作实例》JSONArray是org.json库用于处理JSON数组的类,可将Java对象(Map/List)转换为JSON格式,提供增删改查等操作,适用于前后端... 目录1. jsONArray定义与功能1.1 JSONArray概念阐释1.1.1 什么是JSONA

nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析(结合应用场景)

《nginx-t、nginx-sstop和nginx-sreload命令的详细解析(结合应用场景)》本文解析Nginx的-t、-sstop、-sreload命令,分别用于配置语法检... 以下是关于 nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析,结合实际应

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien