数据结构与算法之HashBitMap

news2024/11/26 22:34:51

一:引入

        1.Hash扩容算法在多线程情况有什么问题?

        2.如何在3亿个整数(0~2亿)中判断某一个数是否存在?内存限制500M,一台机器。

        分治:

        布隆过滤器:神器

        Redis Hash: 开3亿个空间,

        HashMap put(key,value) put(1,true);

        数组:年龄问题;data[2亿] ,开始都为0,data[1]=1 表示存在 可行吗?不可形

        Bit:bitMap,位图; 最小的单位:bit,byte 1Btye=8bit Char Int=bit?Int = 4byte=4*8bit

        

1.1 Hash扩容算法在多线程时的问题:

        1.多线程put操作,get会死循环()。这个确实可以优化掉,比如扩容的时候我们新开一个数组,不要使用共享的那个数组

        2.多线程put可能会导致get取值错误 为什么会出现死循环呢?

        上节课我们讲到hash冲突时我们会采用了链式结构来保存冲突的值。如果我们在遍历这个链表时本身是这样的1->2->3->null 如果我们遍历到3本身应该是null的,这时候刚好有人把这个null给计算出了值,null => 1->3,这下就完了 原来的3本来是要指向null结束的 这下又变成指向1,而这个1又刚好指向3 ,这样是不是就一直循环下去了。。

1.2 既然Hash扩容是线程非安全的,那我们该怎么用?

        1.使用了hash的系统尽可能的单线程操作

        2.如果是多线程环境则要注意加锁。比如jdk里面就可以使用ConCurrentHashMap

        Jdk1.7:分段锁 算法课上就不做深入分析了,大家可以去网上查下资料,这方面的实在是太多了,属于JAVA必须掌握的内容,当然不是学习Java的同学可以不用看,只需要知道我上面讲的那个多线程的情况下不要乱用Hash算法就可以了。

二:BitMap

        2.1 学习bitmap的前提知识

        类型基础: 计算中最小的内存单位是bit,只可以表示0,1

        1Byte = 8bit 1int = 4byte 32bit Float = 4byte 32bit Long=8byte 64bit Char 2byte 16bit Int a = 1,这个1在计算中是怎么存储的?

        0000 0000 0000 0000 0000 0000 0000 0001 

        2 << 1 = 2*2   2 << 2 = 2 * 4

        运算符基础: 左移 << : 8 << 2 = > 8*4=32

        8:     0000 0000 0000 0000 0000 0000 0000 1000

        <<2: 0000 0000 0000 0000 0000 0000 0010 0000    => 2^5= 2*2*2*2*2=32

        右移 >>:8 >> : 8 / 4 = 2

        8:     0000 0000 0000 0000 0000 0000 0000 1000

        <<2: 0000 0000 0000 0000 0000 0000 0000 0010      => 2^1=2  

        8 / 4 => 8 >> 2

        8*4 => 8 << 2

        位与 &:同位上的两个数都是1则位1,否则为0

        位或 |:同为上的两个数只要有一个为1 则为1,否则为0

        

        2.2 BitMap

        通过以上知识我们可以知道 一个int占32个bit位。假如我们用这个32个bit位的每一位的值来表示一个数的话是不是就可以表示32个数字,也就是说32个数字只需要一个int所占的空间大小就可以了,瞬间就可以缩小空间32倍。 比如假设我们有N{2,3,64}个数中最大的是MAX,那么我们只需要开int[MAX /32+1]个int数组就可以存储完这些数据,具体可以看以下结构: Int a : 0000 0000 0000 0000 0000 0000 0000 0000 这里是32个位置,我们可以利用每个位置的0或者1来表示该位置的数是否存在,这样我们就可以得到以下存储结构:具体我们可以画个图来展示

Data[0]:0~31 32位

Data[1]:32~63 32位

Data[2]:64~95 32位;

Data[MAX /32+1]

假设我们要判断100是否在列表中,那么我们就可以这样来计算: 65/32=2 =>定位到data[2],65%32=1 定位到data[2]的第2位(注意这里从右边开始数)。我们再来看data[2]的第二位是否是1,如果是1则列表中存在65,否则不存在。

这就是bitMap算法的核心思想。

package tree.bitmap;

public class BitMap {

	byte[] bits;		//如果是byte那就一个只能存8个数
	int max;			//表示最大的那个数

	public BitMap(int max) {
		this.max = max;
		bits = new byte[(max >> 3) + 1];		//max/8 + 1
	}	
	public void add(int n) {		//往bitmap里面添加数字
		
		int bitsIndex = n >> 3;		// 除以8 就可以知道在那个byte  哪一个数组
		int loc = n % 8;		///这里其实还可以用&运算  位置
		//接下来就是要把bit数组里面的 bisIndex这个下标的byte里面的 第loc 个bit位置为1
		bits[bitsIndex] |= 1 << loc; //
		//
	}
	public boolean find(int n) {
		int bitsIndex = n >> 3;		// 除以8 就可以知道在那个byte
		int loc = n % 8;		///这里其实还可以用&运算
		
		int flag = bits[bitsIndex] & (1 << loc);	//如果原来的那个位置是0 那肯定就是0 只有那个位置是1 才行
		if(flag == 0) return false;
		return true;
	}
	public static void main(String[] args) {
		BitMap bitMap = new BitMap(200000001);	//10亿
		bitMap.add(2);
		bitMap.add(3);
		bitMap.add(65);
		bitMap.add(66);
		
		System.out.println(bitMap.find(3));
		System.out.println(bitMap.find(64));
	}
	
}

三:应用

        3.1优点:

                1.数据判重

                2.对没有重复的数据排序,既然处理不了重复的数据 那么也处理不了Hash冲突,假如我们只有10个数(0~10亿)如果用bitmap你还是要开10亿/32个空间,我们直接用hashMap 或者一个10个空间的数组是不是就更好了。下周二我们解决这个重复问题;邮件过滤,爬虫判重等。hbase

                3.根据1和2可以扩展出很多其他的应用,比如找不重复的数,统计数据等

        3.2缺点:

                1.数据不能重复:数据只有0和1 也就是有或者没有 不知道有多个

                2.数据量少时相对于普通的hash没有优势

                3.无法处理字符串:hash冲突

        

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Go 夜读 第 148 期] Excelize 构建 WebAssembly 版本跨语言支持实践

Excelize 是 Go 语言编写的用于操作电子表格文档的基础库&#xff0c;支持 XLAM / XLSM / XLSX / XLTM / XLTX 等多种文档格式&#xff0c;高度兼容带有样式、图片 (表)、透视表、切片器等复杂组件的文档&#xff0c;并提供流式读写支持&#xff0c;用于处理包含大规模数据的工…

【项目管理】--敏捷开发管理之Scrum

目录 一、前言二、what---敏捷开发是什么2.1、敏捷开发宣言2.2、敏捷开发原则2.3、一句话概述敏捷开发三、why---为什么会有敏捷开发3.1、传统开发模式和敏捷开发模式对比四、how---敏捷开发怎么实践到项目团队4.1、what---Scrum是什么4.2、what---Scrum有哪些内容(1)、Scrum之…

【C语言练习】DOS黑框框通讯录(使用结构体、动态内存管理联系人信息,函数指针等)

文章目录 1. contacts.h 头文件、函数/常量/结构体声明2. test.c 主界面菜单打印、菜单功能选项选择3. contacts.c 函数实现4. 使用结构体、动态内存&#xff0c;函数指针实现时的注意点5. 运行演示 1. contacts.h 头文件、函数/常量/结构体声明 #pragma once#include <std…

浏览器原生JavaScript离线文字转语音TTS播放,支持Windows自带TTS语音和移动端(安卓、IOS)

前言 JS已经可以实现语音合成(文字转语音)和语音识别(语音转文字),各个浏览器支持列表如下所示: 语音识别支持列表: 因此,浏览器上面使用语音合成非常简单。 页面效果示例: 实现功能 1、支持速度,音调设置 2、支持下拉选择语音模板 3、文字转语音 代码实现 …

自学视觉SLAM(1)

引言 小编研究生的研究方向是视觉SLAM&#xff0c;目前在自学&#xff0c;已经学了Linux系统的基本操作&#xff0c;vim编辑器以及高翔老师的一些视屏。本篇文章为初学笔记。 文章目录 引言1 熟悉 Linux1.1 如何在 Ubuntu 中安装软件&#xff08;命令⾏界⾯&#xff09;&#x…

算法竞赛备赛之动态规划训练提升,DP基础掌握

1.背包问题 1.1.01背包问题 01背包问题是在M件物品中选择若干件放在空间为W的背包中&#xff0c;每件物品的体积为W1&#xff0c;W2至Wn&#xff0c;价值为P1&#xff0c;P2至Pn&#xff0c;01背包的约束条件是给定几种物品&#xff0c;每种物品有且只有一个&#xff0c;并且…

(4) OpenCV图像处理kNN近邻算法-识别数字0和1

我们的目标是构建一个可以读取手写数字的应用程序。为此,我们需要创建一个手写数字的图片文件 “ digits.png ”,图像的像素为:( 320*40 ), 其中包含 32个手写数字(每个数字16个),每个数字都是20x20的图像,如下图。 因此,我们的第 1 步是将图像分割成 32 个不…

华为OD机试 - 第k个排列 - 全排列递归(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

C语言刷题篇(备赛中......)--------( 篇章1 )

前言: 博主报名了一个小比赛&#xff0c;用来写一些基础的C语言题目&#xff0c;正好借此巩固一下基础 希望这些题对你们也有帮助 猫猫跟你说:该学习了 目录 前言: 题目&#xff08; 1 &#xff09; 解题思路 题目&#xff08; 2 &#xff09; 解题思路 题目&#xff…

Linux虚拟机磁盘空间不足怎么办

我是一个目录 1. 在虚拟机客户端扩充磁盘空间2. 检查磁盘空间3. 扩展空间而无需重启虚拟机4. 创建新磁盘分区5. 创建物理卷6. 扩展逻辑卷 对大多数系统管理员来说&#xff0c;扩充 Linux 服务器的磁盘空间是日常的工作之一&#xff0c;下面会通过使用 Linux 命令&#xff0c;在…

Text-to-SQL小白入门(七)PanGu-Coder2论文——RRTF

论文概述 学习这个RRTF之前&#xff0c;可以先学习一下RLHF。 顺带一提&#xff1a;eosphoros-ai组织「DB-GPT开发者」最新有个新项目Awesome-Text2SQL&#xff1a;GitHub - eosphoros-ai/Awesome-Text2SQL: Curated tutorials and resources for Large Language Models, Text2…

ps 去除图标背景色

百度安全验证 https://baijiahao.baidu.com/s?id1766678909759797922&wfrspider&forpc 使用魔术橡皮擦工具&#xff0c;超级简单 最后&#xff0c;保存为PNG格式&#xff0c;因为PNG格式支持透明背景。

大二毕设.3-网盘系统-文件模块讲解

目录 模块功能介绍 抽象文件存储引擎顶级接口 高性能单文件上传-sendfile零拷贝 为什么要分片上传 文件存储引擎模块讲解 文件模块具体实现讲解 项目演示博客 模块功能介绍 文件列表查询 聚簇索引和非聚簇索引回表查询最左前缀原则覆盖索引创建文件夹文件重命名文件删除 …

jvs-rules(规则引擎)和jvs智能bi(自助式数据分析)9.22更新内容

规则引擎更新功能 新增: 1.新增节点匹配筛选 用于做多个条件的数据筛选&#xff0c;以便将符合条件的数据传递给下一个节点进行处理&#xff0c;通常用于实现复杂的查询逻辑。 2.复合变量节点新增判断条件选项说明 用户可以根据自己的需求&#xff0c;为复合变量节点添加不…

全球化、国际化、本地化和翻译:GILT 的方法

为促进公司走向全球市场&#xff0c;您需要与客户沟通&#xff0c;并成功传达您的信息。您可能会认为&#xff0c;您需要的只是一支强大的翻译团队。但是&#xff0c;翻译并不像看起来那么简单。 将公司信息翻译成另一种语言&#xff0c;需要了解一些细微差别和文化背景。要想在…

合合信息、上海大学、华南理工大学发布业内首个古彝文编码“大字典” ,为古文字打造“身份证”

“乌蒙山连着山外山&#xff0c;月光洒向了响水滩。”近期在各大短视频平台爆火的《奢香夫人》你听过吗&#xff1f;奢香夫人是一位彝族“巾帼英雄”&#xff0c;这首同名歌曲早在2009年便已发布&#xff0c;如今突然“翻红”&#xff0c;不仅体现了大众对于少数民族文化高涨的…

竞赛 基于生成对抗网络的照片上色动态算法设计与实现 - 深度学习 opencv python

文章目录 1 前言1 课题背景2 GAN(生成对抗网络)2.1 简介2.2 基本原理 3 DeOldify 框架4 First Order Motion Model5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于生成对抗网络的照片上色动态算法设计与实现 该项目较为新颖&am…

计算糖果(牛客)

一、题目 计算糖果_牛客题霸_牛客网 二、代码 #include <iostream> using namespace std;int main() {int x, y, m, n;cin >> x >> y >> m >> n;//A-Bx B-Cy ABm BCnif ((x > 30 || x < -30) && (y > 30 || y < -30) &am…

【Vue】模板语法,插值、指令、过滤器、计算属性及监听属性(内含面试题及毕设等实用案例)上篇

一、引言 1、什么是模板语法&#xff1f; Vue 的模板语法是一种用于在 HTML 中声明式地渲染 Vue 组件的语法。它基于 HTML&#xff0c;并通过特定的模板语法扩展了 HTML。Vue 使用了一种称为 “Mustache” 语法的模板插值来绑定数据到 HTML 元素上。 在 Vue 的模板语法中&…

像专业人士一样部署:掌握代码部署的最佳实践

作为开发人员&#xff0c;您知道部署代码可能是一个耗时且复杂的过程。简化生产部署对于确保您的代码尽快有效地到达用户手中至关重要。但如何实现这一目标呢&#xff1f;在本文中&#xff0c;我们将讨论简化生产部署的一些基本提示和技巧。 从自动化构建过程到优化发布策略&am…