布谷鸟hash算法的并行化实现(一)

news2024/11/26 2:47:38

由于本人最近在写一个项目,为了实现数据查找以及数据修改部分的快速操作,所以采用hash对数据进行存储,而在此过程中接触到了布谷鸟hash,觉得这个hash算法还是很有意思并且高效,所以想着进行一些记录,本系列将对基本的布谷鸟hash算法进行详细描述以及原理讲解,并在此过程中对布谷鸟hash进行并行化实现,内容相对来说较多,会通过多篇博客进行讲解如果在此过程中有同学对文章有不同理解或者有疑问的请在评论区中提出,希望本系列能够对您有所帮助🚀💕。
在这里插入图片描述

文章目录

  • 前言
  • 初识布谷鸟hash
    • 布谷鸟思想
    • 两个桶+两个哈希函数版本
  • 总结


前言

哈希表是一种常用的数据结构,它可以快速地实现数据的存储和查找,被广泛应用于数据库、网络协议、编译器等领域。然而,传统的哈希表实现常常存在哈希冲突的问题,影响了其性能和效率。

为了解决哈希冲突的问题,布谷鸟哈希算法应运而生。布谷鸟哈希算法采用了一种高效的哈希碰撞解决方案,能够在保证高性能的同时避免哈希冲突,成为了哈希表实现领域的一个重要算法。

随着数据量的不断增加,哈希表的并发性能和处理能力越来越受到关注。因此,为了进一步提高布谷鸟哈希算法的性能和效率,需要对其进行并行化实现。

本文主要介绍布谷鸟哈希算法的基本原理和代码实现。首先,我们将介绍布谷鸟哈希算法的原理和实现,包括哈希函数、冲突处理、布谷鸟路径等方面。然后,我们在后续将探讨如何将布谷鸟哈希算法进行并行化实现,包括并行化思路和方法、代码实现和性能测试等方面。

为了更好地阅读本文,建议读者先了解哈希表的基本概念和原理,以及并行化编程的基本知识和技巧。同时,本文的代码实现基于C++语言,读者需要具备一定的编程基础。


初识布谷鸟hash

布谷鸟哈希算法是一种哈希表实现算法,它采用了一种高效的哈希碰撞解决方案,能够在保证高性能的同时避免哈希冲突。布谷鸟哈希算法的具体实现步骤如下:
1、初始化哈希表:首先需要初始化一个空的哈希表,包括哈希表大小、哈希函数等信息。

2、哈希函数:选择一个合适的哈希函数,将关键字映射到哈希表的槽位中。

3、冲突处理:当两个关键字被映射到同一个槽位时,需要进行冲突处理。布谷鸟哈希算法采用了"布谷鸟"的思想,将哈希表中的每个槽位称为"鸟巢",将关键字称为"布谷鸟"。当发生哈希冲突时,将"布谷鸟"放入其他"鸟巢"中,从而避免哈希冲突。

4、布谷鸟路径:为了实现布谷鸟哈希算法中的"布谷鸟"移动,需要定义"布谷鸟路径"。“布谷鸟路径"是一个序列,包括多个"鸟巢”,用于存储"布谷鸟"的移动路径。当发生哈希冲突时,将"布谷鸟"移动到"布谷鸟路径"中的下一个"鸟巢"中,直到找到一个空的"鸟巢",从而解决哈希冲突。

5、扩容处理:当哈希表的负载因子达到一定阈值时(这里一般是以“kick out“作为标准),需要对哈希表进行扩容。扩容的过程包括创建一个新的哈希表、将旧哈希表中的数据迁移到新哈希表中、将全局哈希表指针指向新哈希表等步骤。

总之,布谷鸟哈希算法采用了一种高效的哈希碰撞解决方案,能够在保证高性能的同时避免哈希冲突。它是一种非常实用的哈希表实现算法,在数据存储和查找、哈希碰撞处理等方面都具有重要的应用价值。


布谷鸟思想

布谷鸟思想来自布谷鸟筑巢的思想,布谷鸟的行为主要是:
1、布谷鸟妈妈从不筑巢,它将自己的鸟蛋生在其他鸟类的巢穴里,要别的鸟给它孵蛋
2、新出生的布谷鸟会本能地将巢穴里的其他蛋踢开(kick out ),推出鸟巢,以确保自己在鸟巢里可以独享宠爱。
我们来举个例子吧:借用大佬的几张图,目前要往哈希桶中插入129、312、875以及234四个元素,并且有两个hash函数,h1(x)=x%5以及h2(x)=(x/10)%5
在这里插入图片描述
当我要对234进行插入时产生冲突(先使用h1进行映射,发现h1(234) = 234%5 = 4,但是bucket的四号位已经给占了)
在这里插入图片描述
那么接下来的流程就是:
1、将129kick out(利用h2(x)=(x/10)%5对129进行再次计算)
在这里插入图片描述
发现h2(129) = 2,但是bucket的2号位也给占了,所以129踢出312,而312利用h2哈希函数进行重新计算
在这里插入图片描述

布谷鸟哈希的具体实现方式可以根据情况而异,可以采用不同的桶数和哈希函数数量来满足不同的需求。一般来说,布谷鸟哈希的实现方式可以分为以下几种情况:

  • 一个桶+两个哈希函数:这种实现方式在处理哈希冲突时比上一种方式更加高效,因为它使用了两个哈希函数来减少冲突的可能性。当键值对哈希到同一个桶时,会使用第二个哈希函数来计算一个新的桶号,以减少冲突的可能性。

  • 两个桶+两个哈希函数:这种实现方式使用了两个桶和两个哈希函数,每个桶都有一个对应的哈希函数。当键值对哈希到同一个桶时,会将它们插入到另一个桶中,以减少冲突的可能性。

  • 多个桶+多个哈希函数


两个桶+两个哈希函数版本

在这分享两个桶+两个哈希函数的版本
步骤如下:
两个hash函数分别是hash1和hash2,而两个桶分别是table1和table2
1、首先使用hash1来处理key,得到6,应该放到table1的6号位,但是发现table1的6号位有a在,所以将key放到6号位,将a给kick out。
在这里插入图片描述

2、将a通过hash2进行重新计算,得到5,应该将a放到table2的5号位,但是发现table2的5号位有b在,所以将a放到table2的5号位,将b给kick out.
在这里插入图片描述

3、将b通过hash1进行重新计算,得到2,应该将b放到table1的2号位,由于2号位没存东西,那么就将b给放到table1的2号位,结束插入。
在这里插入图片描述

总的来说呢就是,先将元素通过hash1放到table1中,如果在table1中发生冲突,就使用hash2来处理刚刚被kick out的值,将重新得到的结果放入到table2中,如果在table2中又发生冲突,那就就使用hash1来处理被kick out的值,将计算结果放入到hash1中,直到找到空位置。

这里需要提到的是,假如我们在一次插入的时候kick out元素的次数到达一定的阈值(比如是501次),但是我们在初始的时候设置的kick out 的最大次数是500次,那么这时候就需要将hash桶给进行扩容(说明冲突太多了需要调整好桶的大小),再将桶中的数据进行重新映射插入


总结

本节主要是讲解了布谷鸟hash的一些相关概念、思想以及图解,在下一篇文章中将着眼于代码实现,以及布谷鸟hash的一些变体,希望这篇文章能够对您有所帮助,如果觉得这篇文章的一些地方有问题或者有不同理解也请在评论区中提出,谢谢您嘞😊🚀🚀
在这里插入图片描述

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

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

相关文章

一文带你快速掌握如何读懂 YonBuilder移动开发 的项目源码

本文将通过四大步的简单讲述,让新手开发者朋友们快速掌握阅读YonBuilder移动开发项目源码的技巧方法。 1.读懂代码的第一步,了解项目的整体文件结构 CSS: 存放css样式的文件; feature:猜测是用来存放特征文件的,实际…

了解投影坐标系统,并在精美的地图上探索

投影坐标系简介 地球椭球体表面也是个曲面,而我们日常生活中的地图及量测空间通常是二维平面,因此在地图制图和线性量测时首先要考虑把曲面转化成平面。由于球面上任何一点的位置是用地理坐标(λ,φ)表示的&#xff0…

计算机三级网络技术总结(更新中)

🍿*★,*:.☆( ̄▽ ̄)/$:*.★* 🍿 🍟欢迎来到前端初见的博文,本文主要讲解我计算机三级网络技术🍟 👨‍🔧 个人主页 : 前端初见 🥞喜欢的朋友可以关注一下&#…

BEV专栏(二)从BEVFormer看BEV流程(下篇)

前言 书接上回,在上一篇文章中,我们介绍了BEVFormer这一先进的BEV算法。在本篇文章中,我们将深入探讨BEVFormer的实现细节,旨在帮助读者更深入地理解BEVFormer的工作原理和性能表现。 本教程禁止转载。同时,本教程来自…

【maven】自定义构建maven的jar包依赖

前言 自己定义自己的maven的jar包依赖&#xff0c;本地版本。 实现 pom.xml pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSche…

车载软件架构——闲聊几句AUTOSAR BSW(五)

我是穿拖鞋的汉子,魔都中坚持长期主义的工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 我们并不必要为了和谐,而时刻保持通情达理;我们需要具备的是,偶尔有肚量欣然承认在某些方面我们可能会有些不可理喻。该有主见的时候能掷地有声地镇得住场…

车载基础软件——基础软件验证平台(网络管理和诊断)

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 我们并不必要为了和谐&#xff0c;而时刻保持通情达理&#xff1b;我们需要具备的是&#xff0c;偶尔有肚量欣然承…

部署packstack及问题总结

目录 一、部署packstack 1.1 简介 1.2 性能搭配 1.3 准备工作 1.4 安装 二、出现的问题 2.1 安装中断临时文件 2.2 提示某个安装包出错 2.3 leatherman版本太高 三、安装成功 一、部署packstack 1.1 简介 对于openstack初学者而言&#xff0c;传统部署openstack流程…

MQ-rabbitMQ_基础篇

MQ-rabbitMQ_基础篇 1.MQ1.1什么是MQ1,2应用 2.常见消息中间件协议&#xff08;模型&#xff09;2.1JMS模型&#xff08;协议&#xff09;2.2AMQP协议 3.RabbitMQ3.1六种工作模式3.1.1Hello Word简单模式3.1.2word queues 工作队列能者多劳 3.1.3Publish/Subscribe 发布与订阅模…

在SwissTargetsPrediction数据库中预测成分靶点

1.对筛选的多肽成分进行靶点预测&#xff1a; ①用Uniport中的蛋白进行一系列操作&#xff08;水解&#xff0c;挑选2~8短肽&#xff0c;活性预测&#xff0c;毒性&#xff0c;过敏性预测&#xff0c;胃肠吸收度&#xff0c;半衰期和苦味的预测、生物活性功能预测&#xff09;…

mybatis连接池源码分析

文章目录 前言一、PooledDataSourceFactory二、获取连接三、归还连接 前言 其实大部分连接池的代码都大同小异&#xff0c;总体获取连接&#xff0c;归还连接逻辑大都相同。希望通过阅读本文章&#xff0c;能给你带来帮助。 测试用例 public void testMybatis()throws Excepti…

深入篇【C++】类与对象:运算符重载详解

深入篇【C】类与对象&#xff1a;运算符重载详解 ⏰一.运算符重载&#x1f553;1.<运算符重载&#x1f550;2.>运算符重载&#x1f552;3.运算符重载&#x1f551;4.运算符重载①.格式1.改进12.改进2 ②.默认成员函数1.功能2.不足 &#x1f553;5.<运算符重载&#x1…

学内核之十九:Linux文件系统结构大蓝图

目录 一&#xff1a;参考资料 二&#xff1a;整理的原因及基本原则 三&#xff1a;Linux文件系统大蓝图 四&#xff1a;补充说明 一&#xff1a;参考资料 博主梳理的关于文件系统的基础知识&#xff1a; 7.5 文件系统_定义_龙赤子的博客-CSDN博客 博主转载的关于page cac…

深入理解深度学习——正则化(Regularization):参数范数惩罚

分类目录&#xff1a;《深入理解深度学习》总目录 正则化在深度学习的出现前就已经被使用了数十年。线性模型&#xff0c;如线性回归和逻辑回归可以使用简单、直接、有效的正则化策略。许多正则化方法通过对目标函数 J J J添加一个参数范数惩罚 Ω ( θ ) \Omega(\theta) Ω(θ…

三、Neo4j 源码研究系列 - 持久化

version: v-2023051401 author: 路__ 说到数据库&#xff0c;那么离不开的模块就是持久化&#xff08;Persistence&#xff09;&#xff0c;数据持久化是数据库不可缺少的重要组成模块之一。可以说一个数据库少了持久化功能&#xff0c;可以说这个数据库就不足以称为数据库。…

并查集:解密算法面试中的常客

文章目录 1. 并查集原理&#x1f351; 举例说明&#x1f351; 并查集的应用 2. 并查集实现&#x1f351; 接口总览&#x1f351; 构造函数&#x1f351; 查询操作&#x1f345; 代码实现 &#x1f351; 合并操作&#x1f345; 动图演示&#x1f345; 代码实现 &#x1f351; 判…

Linux文件打开函数open()

#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> int main(void) {int fd -1; /*这个整数用来存放文件描述符*/char filename[] "good.txt"; /*打开的文件名&#xff0c;是一个字符数组…

String类 [下]

目录 一、拷贝构造和赋值重载的传统写法和现代写法 0x01 拷贝构造的传统写法 0x02 拷贝构造的现代写法 0x03 赋值重载的传统写法 0x04 赋值重载的现代写法 0x05 总结 二、 增删改查之后的string 0x01 成员函数swap: 0x02 reserve&#xff1a;改变容量 0x03 push_back: 尾…

带你深入理解Java异常

&#x1f495;“人生就像一盘棋&#xff0c;有时候你慢一步&#xff0c;就输掉了一局。但只要你不停止思考和行动&#xff0c;就永远有机会翻盘。”&#x1f495; &#x1f43c;作者&#xff1a;不能再留遗憾了&#x1f43c; &#x1f386;专栏&#xff1a;Java学习&#x1f38…

《计算机网络——自顶向下方法》精炼——3.4.1-3.4.3

聪明出于勤奋,天才在于积累。——华罗庚 文章目录 对协议的进一步改进rdt2.1rdt2.2rdt3.0&#xff1a;含有比特差错和丢包的可靠数据传输协议 流水线协议回退n步&#xff08;GBN&#xff09; 对协议的进一步改进 rdt2.1 在上一篇文章中&#xff0c;我们讲到对于产生比特差错的…