c++中的哈希查找(Hash Search)和B树查找(B-Tree Search)

前言

hello大家好啊,我是文宇,不是文字,是文宇哦,这期也是关于查找算法的。

哈希查找(Hash Search)

哈希查找(Hash Search)是一种基于哈希表的查找算法,它可以在常数时间复杂度(O(1))内完成查找操作。在C++中,使用哈希查找可以快速地找到某个元素或判断某个元素是否存在于集合中。

  1. 哈希函数(Hash Function) 哈希函数是哈希查找的核心,它将关键字映射到一个固定范围内的整数值,这个整数值被称为哈希值。哈希函数应该具有以下几个特点:
  • 散列性:对于不同的关键字,哈希函数应该产生不同的哈希值,即使关键字只有微小的差异。
  • 均匀性:哈希值应该均匀地分布在哈希表的所有位置上,减少冲突的发生。
  1. 哈希表(Hash Table) 哈希表是由一个固定大小的数组和一个哈希函数组成的数据结构。哈希表的大小应该足够大,以便存储所有的关键字,并且能够提供较小的冲突率。每个数组位置称为一个槽(slot),每个槽可以存储一个或多个关键字。

  2. 哈希冲突(Hash Collision) 哈希冲突是指不同的关键字经过哈希函数计算后得到相同的哈希值。由于哈希函数的输出范围是有限的,而关键字的数量往往是无限的,哈希冲突是不可避免的。为了解决哈希冲突,有多种方法可以选择,常见的方法有链地址法和开放地址法。

  3. 链地址法(Chaining) 链地址法是最常用的解决哈希冲突的方法之一。在链地址法中,哈希表的每个槽存储一个链表,哈希冲突的关键字被插入到链表中。当需要查找某个关键字时,首先计算其哈希值,然后在对应的槽中遍历链表,直到找到目标关键字或链表结束。链地址法的优点是实现简单,适用于存储大量的关键字。

  4. 开放地址法(Open Addressing) 开放地址法是另一种解决哈希冲突的方法。在开放地址法中,如果发生哈希冲突,就尝试在哈希表中的其他位置找到空槽来存储关键字。常见的开放地址法有线性探测法和二次探测法等。在开放地址法中,查找某个关键字时,首先计算其哈希值,然后依次检查哈希表中的位置,直到找到目标关键字或遇到空槽。开放地址法的优点是节省内存空间,不需要存储链表的额外空间。

  5. 哈希查找的实现 在C++中,可以使用标准库提供的unordered_map来实现哈希查找。unordered_map是一个哈希表,可以存储键值对。在unordered_map中查找某个关键字的时间复杂度为O(1)。下面是使用unordered_map实现哈希查找的示例代码:

#include <iostream>
#include <unordered_map>int main() {std::unordered_map<int, std::string> hash_map;// 添加元素hash_map.insert(std::make_pair(1, "apple"));hash_map.insert(std::make_pair(2, "banana"));hash_map.insert(std::make_pair(3, "orange"));// 查找元素auto iter = hash_map.find(2);if (iter != hash_map.end()) {std::cout << "Found: " << iter->second << std::endl;} else {std::cout << "Not found" << std::endl;}return 0;
}

在上面的代码中,我们首先创建了一个unordered_map对象hash_map,然后使用insert函数插入了三个键值对。接着使用find函数查找关键字为2的元素,如果找到了就输出对应的值,否则输出"Not found"。运行上面的代码,输出结果为"Found: banana"。

总结: 哈希查找是一种高效的查找算法,它可以在常数时间内完成查找操作。在C++中,可以使用unordered_map来实现哈希查找。要实现哈希查找,需要定义好哈希函数和解决哈希冲突的方法。哈希查找适用于需要快速查找和判断某个元素是否存在的场景,但是需要注意选择合适的哈希函数和适当的哈希表大小,以保证较小的冲突率。

B树查找(B-Tree Search)

B树(B-Tree)是一种自平衡的搜索树数据结构,广泛应用于数据库和文件系统中。B树具有高效的查找、插入和删除操作,能够处理大量数据,并且能够保持树的平衡性。

B树是一颗多叉树,它的每个节点可以存储多个关键字,并且按照关键字的顺序排序。B树具有以下特点:

  1. 所有叶节点具有相同的深度,也就是树的高度。
  2. 除了根节点和叶节点,其他的节点都包含至少⌈m/2⌉个关键字,其中m是B树的阶数。
  3. 每个节点的关键字按照升序排列,并且节点之间存在前后关系。

B树的查找操作是通过比较节点的关键字进行的,具体步骤如下:

  1. 从根节点开始,比较待查找关键字与节点中的关键字。
  2. 如果找到了相等的关键字,则表示查找成功,返回对应的值。
  3. 如果待查找关键字小于当前节点的最小关键字,则继续在当前节点的左子树中查找。
  4. 如果待查找关键字大于当前节点的最大关键字,则继续在当前节点的右子树中查找。
  5. 如果待查找关键字在当前节点的关键字范围内,则继续在当前节点的子节点中查找。

为了提高B树的查找效率,B树的节点中通常会保存一些额外信息,比如子节点指针或者数据的指针,这样可以在查找过程中进行快速跳转。

具体的查找算法可以通过递归或者循环来实现。下面是一种基于递归的B树查找算法的伪代码:

Node* BTreeSearch(Node* root, KeyType key) {// 如果根节点为空,则表示查找失败if (root == nullptr) {return nullptr;}// 找到关键字对应的位置int i = 0;while (i < root->keyNum && key > root->key[i]) {i++;}// 如果找到了关键字,则返回对应的节点if (i < root->keyNum && key == root->key[i]) {return root;}// 否则,根据关键字的范围继续在子节点中查找if (root->isLeaf) {return nullptr;} else {return BTreeSearch(root->child[i], key);}
}

上述伪代码中的Node表示B树的节点,KeyType表示关键字的类型。该算法从根节点开始查找,如果根节点为空,则表示查找失败;如果找到了关键字,则返回对应的节点;否则,根据关键字的范围继续在子节点中查找。如果当前节点是叶节点,则查找失败;否则,递归地在相应的子节点中查找。

B树的查找算法的时间复杂度为O(logN),其中N为树中的节点数。由于B树具有平衡性,每个节点平均具有⌈m/2⌉个关键字,树的高度为O(logN),因此查找操作可以在O(logN)时间内完成。同时,由于B树的节点可以存储多个关键字,相较于二叉搜索树,B树的层次更少,磁盘IO的次数也更少,从而提高了查找的效率。

总结而言,B树是一种高效的自平衡搜索树数据结构,适用于处理大量数据的情况。B树的查找操作可以通过比较节点的关键字进行,具有O(logN)的时间复杂度。B树的查找算法可以通过递归或者循环来实现,具体的实现方式可以根据实际情况选择。

结语

好的,第二篇就到这里结束了,明天写关于递归的算法。(注:我的文章基本上是提前写好后检查一下发布。然后周一,三,五因为有事,所以少更一些)

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

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

相关文章

STL常用算法——常用查找算法

自定义类型都要用仿函数判断 1.find() class Person { public:Person(string name,int age){this->m_Name name;this->m_Age age;}bool operator(const Person &p)//重载operator{if (this->m_Name p.m_Name && this->m_Age p.m_Age){return true;…

【云原生】NameSpace名称空间详解

名称空间 文章目录 名称空间一、名字空间二、何时使用多个名称空间三、初始名称空间3.1、default3.2、kube-node-lease3.3、kube-public3.4、kube-system 四、通过名称空间共享集群4.1、查看名称空间4.2、获取名称空间详细信息4.3、名称空间的两种状态4.4、创建名称空间4.5、删…

NVIDIA 全面转向开源 GPU 内核模块

NVIDIA 全面转向开源 GPU 内核模块 文章目录 NVIDIA 全面转向开源 GPU 内核模块支持的 GPU安装程序更改使用带有 CUDA 元包的包管理器 使用运行文件使用安装帮助脚本包管理器详细信息dnf&#xff1a;Red Hat Enterprise Linux、Fedora、Kylin、Amazon Linux 或 Rocky Linuxzypp…

网络安全等级保护:什么是网络安全等级保护?(非常详细)零基础入门到精通,收藏这一篇就够了

关键词&#xff1a; 网络安全等级保护 等级保护 网络 信息系统 旧话重提&#xff0c;一直以来&#xff0c;我们不断强调“等级保护”制度是我国的网络安全领域的基本制度、基本策略和基本方法&#xff0c;是促进信息化健康发展&#xff0c;维护国家安全、社会秩序和公共利益的…

数字图像处理中的常用特殊矩阵及MATLAB应用

一、前言 Matlab的名称来源于“矩阵实验室&#xff08;Matrix Laboratory&#xff09;”&#xff0c;其对矩阵的操作具有先天性的优势&#xff08;特别是相对于C语言的数组来说&#xff09;。在数字图像处理中&#xff0c;为了提高编程效率&#xff0c;我们可以使用多种方式来创…

Mysql数据库和Sql语句

数据库管理&#xff1a; sql语句&#xff1a;数据库用来增删改查的语句&#xff08;重要&#xff09; 备份&#xff1a;数据库的数据进行备份 主从复制、读写分离、高可用&#xff08;重要&#xff09; Mysql数据库和Sql语句 一、Mysql数据库 1、数据库&#xff1a;组织、…

Java基础(四) 内部类详解

Java 内部类详解 一. 内部类概述 内部类是嵌套在类内部进行定义的类&#xff0c;其外部的类则被称为外部类&#xff1b;按照内部类的定义位置&#xff0c;内部类可进一步划分为成员内部类、静态内部类、局部内部类和匿名内部类四种类型。内部类的出现实际上是进一步丰富了类的…

使用Python实现深度学习模型:用户行为预测与个性化服务

介绍 在这篇教程中,我们将构建一个深度学习模型,用于用户行为预测和个性化服务。我们将使用TensorFlow和Keras库来实现这一目标。通过这个教程,你将学会如何处理数据、构建和训练模型,并将模型应用于实际的用户行为预测和个性化服务任务。 项目结构 首先,让我们定义项目…

Modbus转BACnet/IP网关的技术实现与应用

引言 随着智能建筑和工业自动化的快速发展&#xff0c;不同通信协议之间的数据交换也变得日益重要。Modbus和BACnet/IP是两种广泛应用于自动化领域的通信协议&#xff0c;Modbus以其简单性和灵活性被广泛用于工业自动化&#xff0c;而BACnet/IP则在楼宇自动化系统中占据主导地…

Android APP 音视频(03)CameraX预览与MediaCodec编码

说明&#xff1a; 此CameraX预览和编码实操主要针对Android12.0系统。通过CameraX预览获取yuv格式数据&#xff0c;将yuv格式数据通过mediacodec编码输出H264码流&#xff08;使用ffmpeg播放&#xff09;&#xff0c;存储到sd卡上。 1 CameraX 和 MediaCodec简介 1.1 CameraX…

Redission中的Lua脚本写法、理解

对于Redission看门狗机制中的为了保证原子性的Lua脚本的写法规则是什么样的呢 &#xff1f; 对于源码中的Lua脚本又是什么意思&#xff1f; 我们一起来看一下 首先&#xff0c;我们先基本的熟悉一下lua脚本的逻辑 在Lua脚本中&#xff0c;if (…) then … end 语句的执行过程…

“微软蓝屏”事件,给IT行业带来的宝贵经验和教训

“微软蓝屏”事件是指2024年7月19日发生的一次全球性技术故障&#xff0c;主要涉及微软视窗&#xff08;Windows&#xff09;操作系统及其相关应用和服务。 以下是对该事件的详细解析&#xff1a; 一、事件概述 发生时间&#xff1a;2024年7月19日事件影响&#xff1a;全球多个…

【科学文献计量】中国知网(CNKI) 文献素材库生成软件详细使用说明

CNKI 文献素材库生成软件制作 1 背景2 使用步骤2.1 文献检索2.2 文献导出2.3 软件生成1 背景 在进行中文文献的综述时,往往是要借助中国知网(CNKI)文献检索平台,写作插入文献时会用Endnote软件进行辅助。因此就有需求:对于CNKI检索的结果直接导出到本地,第一是方便快速阅…

com.alibaba.fastjson.JSONObject类介绍、应用场景和示例代码

概述 功能特点&#xff1a; 解析 JSON 字符串为 Java 对象。将 Java 对象序列化为 JSON 字符串。支持链式操作&#xff0c;便于对 JSON 数据进行增删改查。 应用场景&#xff1a; 与前端进行 JSON 数据的交互&#xff0c;如 RESTful API 的数据传输。处理第三方接口返回的 …

基于STM32的农业大棚温湿度采集控制系统的设计

目录 1、设计要求 2、系统功能 3、演示视频和实物 4、系统设计框图 5、软件设计流程图 6、原理图 7、主程序 8、总结 &#x1f91e;大家好&#xff0c;这里是5132单片机毕设设计项目分享&#xff0c;今天给大家分享的是智能教室。 设备的详细功能见网盘中的文章《8、基…

“机器说人话”-AI 时代的物联网

万物互联的物联网愿景已经提了许多年了&#xff0c;但是实际效果并不理想&#xff0c;除了某些厂商自己的产品生态中的产品实现了互联之外&#xff0c;就连手机控制空调&#xff0c;电视机和调光灯都没有实现。感觉小米做的好一点&#xff0c;而华为的鸿蒙的全场景&#xff0c;…

Ubuntu24.04安装mysql-server小计,解决mysql_secure_installation时不能重置密码的问题

Ubuntu24.04安装mysql-server小计&#xff0c;解决mysql_secure_installation时不能重置密码的问题 为什么要写这往篇文章&#xff1f; 一般情况下&#xff0c;我安装mysql都用源码编译&#xff0c;以此方便安装更多自定义插件&#xff0c;但这次只需要安装一台开发机&#x…

C#+layui+echarts实现动态生成折线图

概要 C#layuiecharts实现动态生成折线图 整体架构流程 后端是c#语言编写的业务流程,前端是layui和echarts 技术细节 1.先看echarts折线图需要什么样子的数据,在想后端怎么处理 2.后端代码 List<ValveTempData> list new List<ValveTempData>(); string …

学懂C语言(十九):C语言指针详解

一、什么是指针&#xff1f; 指针是一个变量&#xff0c;其存储的是另一个变量的内存地址。在计算机内存中&#xff0c;每个存储单元都有一个唯一的地址&#xff0c;指针就是用来存放这些地址的。因此&#xff0c;通过指针&#xff0c;你可以间接访问和修改内存中的数据。就像其…

Linux提供的定时器

定时器在许多场景中非常有用&#xff0c;尤其是在需要精确定时或定时执行某些任务的情况下。而Linux专门为定时器提供了一套定时器接口。 timerfd_creat timerfd_create是 Linux 中用于创建定时器文件描述符的函数。这个功能主要是用来在指定的时间后或定时间隔内触发事件&am…