位图+布隆过滤器+海量数据并查集(它们都是哈希的应用)
一)位图:
首先计算一下存储一下10亿个整形数据,需要多大内存呢,多少个G呢?
2^30=10亿,10亿个字节
byte kb mb gb
100000000个字节/1024/1024/1024=1G
所以10亿个字节就是1G,所以40亿个字节就是4G,也就是10个整形数据
给定40亿个不重复的无符号整数,没有排过序,给定一个无符号整数,如何可以快速地判断出一个数是否在这40亿个数中?
解法1:哈希表,10亿个字节,大概是1G,一个int型占4字节,10亿就是40亿字节很明显就是4GB,也就是如果完全读入内存需要占用4GB,40亿个整数是16G,一般运行内存存不下,所以说使用哈希表进行遍历时间复杂度是O(N)
解法2:排序+二分查找,O(N+logN),内存也是存不下的,二分查找必须是在内存中进行二分查找
解法3:位图,假设40亿个数据放到了40亿个比特位里面,2^32=40个亿,40亿除8等于X字节,X字节/1024=YKB,YKB/1024=ZMB=512M,1个位占用一个数据,所以仅仅使用512M内存就可以把这些数据全部存储起来,位图有的资料也称之为是bitMap
1)数据是否在给定的整形数据中恰好是在与不在,刚好是两种状态,那么此时就可以使用一个二进制比特位来代表数据是否存在的信息,如果二进制比特位为1,那么代表存在,为0表示不存在,比如说下面这个例子
2)array[index]/8确定的是在那一段区间
array[index]%8确定在那一段区间的哪一个位置
3)也可以很方便进行排序:从左到右输出二进制比特位是1的数据,但是有多个重复的数字就不好处理了,所以位图适用于整形况且没有重复的数据
4)所谓位图,就是用每一位来存放某种状态,适用于海量数据,整数,数据无重复的场景。通常是用来判断某个数据存不存在的
5)位图天然是可以去重的,JAVA当中有一个类叫做BitMap,也叫做位图,也是JAVA.util的类,BitMap底层实现的是long[],但是我们所实现的是byte[]数组,是用于快速查找某一个元素是否存在,况且还可以节省空间;
import java.util.Arrays;public class MyBitSet {public byte[] array;//每一个字节的比特位数都是从左到右边依次递增的public int usedSize;//记录在当前这个位图中存放了多少有效的数据public MyBitSet(){this.usedSize=0;this.array=new byte[1];}//这里面的n表示需要多少个比特位,有可能会多给1个字节,但是也是无所谓的public MyBitSet(int n){this.array=new byte[n/8+1];//假设n=12,此时实际上计算是1个字节,其实现在给2个字节也是可以的this.usedSize=0;}//设置某一位是1public void set(int val){if(val<0) throw new ArrayIndexOutOfBoundsException();int arrayIndex=val/8;//先找到这个数要放到第几个字节if(arrayIndex>array.length-1){//等于的时候刚刚好this.array= Arrays.copyOf(array,arrayIndex+1);//数组如果越界,那么直接进行扩容,假设存放130,那么计算的下标是16,那么扩容到17个个字节即可}int bitIndex=val%8;//再找到要修改这个字节的第几位//也就是说我们要把array[arrayIndex]的第bitIndex位设置成1this.array[arrayIndex]|=(1<<bitIndex);usedSize++;}//判断当前位是不是1public boolean get(int val){//判断当前val存储的这一位是1还是0if(val<0) throw new ArrayIndexOutOfBoundsException();int arrayIndex=val/8;if(arrayIndex>array.length-1) return false;int bitIndex=val%8;if(((array[arrayIndex]>>bitIndex)&1)==1) return true;//if((array[array[index]&(1<<bitIndex))!=0)return false;}//将val对应字节的存储对应位置置为0,就是相当于是在位图中删除这个值public void reset(int val){if(val<0) throw new ArrayIndexOutOfBoundsException();int arrayIndex=val/8;int bitIndex=val%8;usedSize--;array[arrayIndex]= (byte) ((~(1<<bitIndex))&array[arrayIndex]);}public int getUsedSize(){return usedSize;//返回当前位图中所存储的元素个数}//根据位图来进行排序public static void main(String[] args) {int[] nums={1,9,8,78,100,20,45,16};MyBitSet set=new MyBitSet(20);//1.现将所有的数字存放到位图里面for(int i=0;i<nums.length;i++){set.set(nums[i]);System.out.println(set.get(nums[i]));}System.out.println(set.getUsedSize());//2.从小到大遍历所有的字节,遍历到其中一个字节之后在进行按照下标从小到大遍历每一个字节里面的比特位for(int i=0;i<set.array.length;i++){for(int j=0;j<8;j++){if(((set.array[i])&(1<<j))!=0){System.out.println(i*8+j);}}}}}
二)布隆过滤器:哈希和位图的一个整合
布隆过滤器的提出:日常生活中在我们进行设计计算机软件的时候,通常要进行判断某一个元素是否在集合中,最直接的方法就是将所有的元素存储到一个哈希表中,当遇到一个新元素的时候,要进行判断当前这个元素是否出现在集合中
1)在布隆过滤器中最终并没有我所需要进行判断的值
2)布隆过滤器是一种比较巧妙的,紧凑型的概率性数据结构,特点是高效的插入和查询,可以用来告诉你某一样东西一定不存在或者是可能存在,它的原理是使用多个哈希函数,将一个数据映射到位图结构中,此种方式不仅仅可以提升查询效率,也是可以进行节省大量的内存空间,下面是类似与布隆过滤器的插入
相关文章:
位图+布隆过滤器+海量数据并查集(它们都是哈希的应用)
一)位图: 首先计算一下存储一下10亿个整形数据,需要多大内存呢,多少个G呢? 2^3010亿,10亿个字节 byte kb mb gb 100000000个字节/1024/1024/10241G 所以10亿个字节就是1G,所以40亿个字节就是4G,也就是10个整…...
MYSQL:Select语句顺序
SELECT子句及其顺序整理表格: 子句 说明是否必须使用SELECT 要返回的列或表达式是FROM 从中检索数据的表仅在从表选择数据使用WHERE 行级过滤否GROUP BY 分组说明仅在按组计算聚…...
Pytest系列-数据驱动@pytest.mark.parametrize(7)
简介 unittest 和 pytest参数化对比: pytest与unittest的一个重要区别就是参数化,unittest框架使用的第三方库ddt来参数化的 而pytest框架: 前置/后置处理函数fixture,它有个参数params专门与request结合使用来传递参数&#x…...
【Qt】QGroundControl入门2:下载、编译、错误处理、运行
1、源码下载 git clone https://github.com/mavlink/qgroundcontrol.git 2、下载依赖库 2.1 查看依赖库的github路径 cat .gitmodules[submodule "src/GPS/Drivers"]path = src/GPS/Driversurl = https://github.com/PX4/GpsDrivers.git [submodule "libs/m…...
【深度学习】Pytorch 系列教程(十):PyTorch数据结构:2、张量操作(Tensor Operations):(4)索引和切片详解
目录 一、前言 二、实验环境 三、PyTorch数据结构 0、分类 1、张量(Tensor) 2、张量操作(Tensor Operations) 1. 数学运算 2. 统计计算 3. 张量变形 4. 索引和切片 使用索引访问单个元素 使用切片访问子集 使用索引和…...
2024字节跳动校招面试真题汇总及其解答(三)
6.jwt与cookie区别 JWT 和 Cookie 都是用于在客户端和服务器之间传输信息的常用方法。但是,它们之间存在一些关键差异。 JWT 是 JSON Web Token 的缩写,它是一种基于 JSON 的加密令牌。JWT 由三部分组成:Header、Payload 和 Signature。Header 包含令牌的类型、加密算法和…...
基于springboot+vue的便利店信息管理系统
博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…...
在ubuntu18.04上编译C++版本jsoncpp/opencv/onnxruntime且如何配置CMakelist把他们用起来~
这篇文章背景是笔者在ubuntu上编译C代码,依赖一些包,然后需要编译并配置到CMakelist做的笔记。主要也是一直不太懂CMakellist,做个笔记以防忘记,也给读者提供一站式的参考,可能您需要的不是这几个包,但大同…...
大二上学期学习计划
这个学期主要学习的技术有SpringBoot,Vue,MybatisPlus,redis,还有要坚持刷题,算法不能落下,要坚持一天至少刷2道题目,如果没有布置任务就刷洛谷上面的,有任务的话就尽量完成任务&…...
【python爬虫—星巴克产品】
文章目录 需求爬取星巴克产品以及图片,星巴克菜单 python爬虫爬取结果 需求 爬取星巴克产品以及图片,星巴克菜单 网页分析: 首先,需要分析星巴克官方网站的结构,了解菜单栏的位置、布局以及菜单项的标签或类名等信息…...
shell SQL 变量 Oracle shell调用SQL操作DB
注意 : v\\\$ 用法, “v\\\$session ” ""不能用 sqlplus -S / as sysdba << EOF set pagesize 0 set verify off set feedback off set echo off col coun new_value v_coun select count(*) coun from dual; EOF value"$?"VALUE…...
【校招VIP】java线程池考点之核心线程数
考点介绍: 线程池是这一两年java大厂提问频度飙升的考点,需要从池子的概念理解相关参数和方法 java线程池考点之核心线程数-相关题目及解析内容可点击文章末尾链接查看! 一、考点试题 1、请列举一下启动线程有哪几种方式,之后再…...
[每周一更]-(第61期):Rust入门策略(持续更新)
一门语言的学习,就要从最基本的语法开始认识,再分析不同语言的区别,再加上实战,才能更快的学会,领悟到作者的设计思想; 介绍 Rust编程练习 开发工具VSCode及插件 社区驱动的 rust-analyzerEven Better T…...
线程安全问题的原因及解决方案
要想知道线程安全问题的原因及解决方案,首先得知道什么是线程安全,想给出一个线程安全的确切定义是复杂的,但我们可以这样认为:如果多线程环境下代码运行的结果是符合我们预期的,即在单线程环境应该的结果,…...
基于matlab中点放炮各类地震波时距曲线程序
完整程序: clear all dx50;x-500:dx:500;%炮检距 h100;V11500; theta25*pi/180; V2V1/sin(theta); t1sqrt(x.*x4*h*h)/V1;%反射波时距曲线 t2abs(x)./V1;%直达波时距曲线 %折射波时距曲线 xm2*h*tan(theta);%求盲区 k1; for i1:length(x) if x(i)<-xm …...
vue中el-dialog 中的内容没有预先加载,因此无法获得内部元素的ref 的解决方案 使用强制提前加载dialog方法
问题描述 在没有进行任何操作的时候,使用 this.$refs.xxxx 无法获取el-dialog中的内部元素,这个问题会导致很多bug,其中目前网络上也有许多关于这个问题的解决方案,但是大多数是使用el-dialog中的open在dialog打开的时候使用thi…...
vue-h5移动Web的rem配置
H5移动的适配方案 rem rem适配方案是兼容性比较好的移动端适配方案,rem支持大部分的移动端系统和机型。 rem是相对于根元素的字体大小的单位。本质上就是一个相对单位,和em的区别是:em是依赖父元素的字体来计算,rem是依赖根元素…...
企业级数据仓库-数仓实战
数仓实战 安装包大小 安装清单 环境搭建 一、环境搭建01(机器准备) 准备好三台虚拟机,并进行修改hostname、在hosts文件增加ip地址和主机名映射 。 1、设置每个虚拟机的hostname vi /etc/sysconfig/network 修改HOSTNAMEnode02修改hostna…...
Spring Boot 下载文件(word/excel等)文件名中文乱码问题|构建打包不存在模版文件(templates等)
Spring Boot 下载文件(word/excel等)文件名中文乱码问题|构建打包不存在模版文件(templates等) 准备文件,这里我放在resource下的templates路径 在pom中配置构建打包的资源,更新maven 如果使用了assembly打包插件这样配置可能仍不生效&#…...
Ansible数组同步至Shell脚本数组中
1、ansible中定义数组,我以 ccaPojectList 数组为例子,如下图数组内容 2、需要写一个j2模板的Shell脚本,在j2模板的Shell脚本中引用ansible的 ccaPojectList 数组,大致如下图: {% for item in ccaPojectList %} "{{ item }…...
线程控制--1
一、进程与线程的1.1 引子进程是房子,线程是房子里的人进程之间是独立的、解耦的(不同房子)线程属于同一个房子,共享房子里的资源1.2 共享 vs 独占线程独占的数据(不是绝对独占,只是当前分配给你࿰…...
IP 溯源技术原理
IP 溯源技术原理 近期,一些网站(如 ip.sy、iptrack.nmqu.com)能够将外网 IP 地址精确到国内具体小区,引发广泛关注。本文从技术角度解析其实现原理,并通过实例数据展示定位精度,重点揭示外网 IP 如何被绑定…...
工业互联网IOT平台介绍(二):工业协议
工业协议(也叫工业通信协议或工控协议)是指专门为工业自动化和工业控制系统设计的通信规则和标准。它定义了PLC、传感器、变频器、伺服驱动器、HMI、上位机等各种工业设备之间如何可靠地交换数据,包括数据格式、传输时序、错误检测、主从/生产…...
springboot+vue二手物品交易boot代码--毕业论文
目录后端代码(SpringBoot)项目结构核心代码示例前端代码(Vue)项目结构核心代码示例数据库配置(application.yml)扩展功能建议项目技术支持可定制开发之功能亮点源码获取详细视频演示 :文章底部获…...
从柳树皮到实验室:水杨酸合成技术演进与化妆品原料安全标准解析
从柳树皮到实验室:水杨酸合成技术演进与化妆品原料安全标准解析 当我们谈论护肤品中的“刷酸”时,水杨酸几乎是一个绕不开的名字。它被成分党们奉为对抗黑头、闭口和痘痘的利器,但很少有人去深究,涂抹在脸上的那一滴精华或乳霜里&…...
从init.rc到StorageManager:图解Android 13存储服务启动全流程
从init.rc到StorageManager:图解Android 13存储服务启动全流程 如果你曾经好奇过,当按下Android设备的电源键,从内核启动到你能在文件管理器中看到“内部存储”和“SD卡”这个过程中,背后究竟发生了什么,那么这篇文章就…...
从PTA实验到实战:一维数组核心算法通关指南
1. 从PTA实验到实战:为什么一维数组是算法的基石 如果你刚开始学编程,尤其是跟着学校的PTA(程序设计类实验辅助教学平台)刷题,大概率会在一维数组这里卡上一阵子。我当年也是,看着那些“最值交换”、“众数…...
WORD自动编号全攻略:从基础到高级定制(图文并茂)
1. 自动编号:不只是“1、2、3”那么简单 很多朋友一听到WORD的“自动编号”,脑子里蹦出来的就是“1、2、3”或者“A、B、C”。我以前也是这么想的,觉得这功能不就是给段落前面加个顺序嘛,能有多复杂?直到有一次&#x…...
Qwen All-in-One效果对比:与传统多模型方案相比优势在哪
Qwen All-in-One效果对比:与传统多模型方案相比优势在哪 1. 传统多模型方案的痛点分析 在AI服务部署领域,传统"多模型堆叠"架构长期占据主导地位。这种方案通常为每个独立任务部署专用模型,例如使用BERT处理情感分析、LLM负责对话…...
基于TI电赛开发板的L298N电机驱动模块PWM调速移植实战
基于TI电赛开发板的L298N电机驱动模块PWM调速移植实战 最近在准备电赛,很多同学都在为智能小车项目里的电机控制发愁。大家手里都有经典的L298N电机驱动模块,但怎么把它和TI的电赛开发板(比如MSP430系列)连起来,用PWM实…...


