【算法-位图法】在海量数据中查找重复元素

2023-10-13 19:30

本文主要是介绍【算法-位图法】在海量数据中查找重复元素,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

什么是位图法?

举个简单例子,在java中一个int类型的数有32位,而这32只表示一个数太过浪费,于是就考虑让这32位可以表示32个数,每一位表示该数是否存在,例如:

这里用16位的二进制就能表示十六个数字,1表示存在,0表示不存在,上图就表示存在(16,12,6,4,1)这五个数。

在海量数据中查找重复出现的元素或者去除重复出现的元素也是常考的问题。针对此类问题,一般可以通过位图法实现,例如,已知某个文件内包含一些电话号码,每个号码为8位数字,统计不同号码的个数。

本题最好的解决办法就是通过位图法来实现。

解题思路:

8位整数可以表示的最大十进制数值为99999999,如果每个数字对应于位图中的一个bit位,那么存储八位整数需要99999999bit大约99Mbit,因为1Byte=8bit,所以99Mbit折合成内存为99/8=12.375MB的内存,及可以只用12.375MB的内存表示所有的8位数电话号码的内容。

程序代码如下:

import java.util.Random;
public class DuplicateTelephone{int randNum=100;int min=10000000;int max=99999999;int len=(max-min+1);int bit_per_word=32;int  word_offset(int b){return b/bit_per_word;}int bit_offset(int b){return b%bit_per_word;}void setBit(int[] words,int n){int temp=n;temp-=min;words[word_offset(temp)]|=(1<<bit_offset(temp));}void clearBit(int[] words,int n){words[word_offset(n)]&=~(1<<bit_offset(n));}boolean getBit(int[] words,int n){int result=words[word_offset(n)]&(1<<bit_offset(n));return result!=0;}public void sort(){int arr[]=new int[randNum];System.out.println("数组大小:"+randNum);int[] words=new int[len/bit_per_word+1];int count=0;Random r=new Random();for(int j=0;j<randNum;j++){arr[j]=r.nextInt(len);arr[j]+=min;System.out.print(arr[j]+" ");}System.out.println();for(int j=0;j<randNum;j++){setBit(words,arr[j]);}System.out.println("排序后a为:");for(int i=0;i<len;i++){if(getBit(words,i)){System.out.print(i+min+" ");count++;}}System.out.println();System.out.println("总个数为:"+count);}public static void main(String[] args){new DuplicateTelephone().sort();}}

运行的结果为:

数组大小:100
46875852 63059260 46888254 54260213 84901496 58876931 28753082 72176161 30014077 84850078 31950213 14204495 26230245 27850510 32455193 68366470 52371514 87138574 94489525 45678876 90450237 42341450 24655913 43282877 49446847 42320941 84516417 35313419 59903775 35761368 11337291 46450272 93115232 55490862 11998766 73065445 47942924 18581547 58818184 77268172 99380374 80558928 16202169 95248485 20644397 34063612 20913170 94324174 67502076 80090509 45820098 81312556 32858162 16476350 15080157 45289864 99027018 87240729 89981567 52198533 39085177 76494986 65134775 93827194 13834939 71752586 32473580 67759555 29073921 72452538 98008564 58115033 64844962 59371680 86529508 69079674 61521841 96326355 25073903 19962950 33966761 83534685 38855968 14084970 85023410 78286139 81124660 48083315 57208466 72108161 26193937 67771844 22611251 51376666 43171943 82768547 47796300 19563949 91347170 47639405
排序后a为:
11337291 11998766 13834939 14084970 14204495 15080157 16202169 16476350 18581547 19563949 19962950 20644397 20913170 22611251 24655913 25073903 26193937 26230245 27850510 28753082 29073921 30014077 31950213 32455193 32473580 32858162 33966761 34063612 35313419 35761368 38855968 39085177 42320941 42341450 43171943 43282877 45289864 45678876 45820098 46450272 46875852 46888254 47639405 47796300 47942924 48083315 49446847 51376666 52198533 52371514 54260213 55490862 57208466 58115033 58818184 58876931 59371680 59903775 61521841 63059260 64844962 65134775 67502076 67759555 67771844 68366470 69079674 71752586 72108161 72176161 72452538 73065445 76494986 77268172 78286139 80090509 80558928 81124660 81312556 82768547 83534685 84516417 84850078 84901496 85023410 86529508 87138574 87240729 89981567 90450237 91347170 93115232 93827194 94324174 94489525 95248485 96326355 98008564 99027018 99380374
总个数为:100

这篇关于【算法-位图法】在海量数据中查找重复元素的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/205365

相关文章

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

nginx 负载均衡配置及如何解决重复登录问题

《nginx负载均衡配置及如何解决重复登录问题》文章详解Nginx源码安装与Docker部署,介绍四层/七层代理区别及负载均衡策略,通过ip_hash解决重复登录问题,对nginx负载均衡配置及如何... 目录一:源码安装:1.配置编译参数2.编译3.编译安装 二,四层代理和七层代理区别1.二者混合使用举例

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核