Python 算法基础篇之散列查找算法:哈希表、哈希集合、哈希映射

news2024/10/5 12:29:23

Python 算法基础篇之散列查找算法:哈希表、哈希集合、哈希映射

  • 引言
  • 1. 散列查找算法概述
  • 2. 哈希表的概念
  • 3. 哈希集合的概念
  • 4. 哈希映射的概念
  • 5. 实例演示
    • 实例1:哈希表
    • 实例2:哈希集合
    • 实例3:哈希映射
  • 总结

引言

散列查找算法是一种高效的查找技术,通过散列函数将键映射到数组的索引位置,实现快速的查找、插入和删除操作。本篇博客将介绍散列查找算法的三种常见应用:哈希表、哈希集合和哈希映射,并通过实例代码演示它们的应用。

😃😄 ❤️ ❤️ ❤️

1. 散列查找算法概述

散列查找算法是一种基于散列函数的查找技术,它将键映射到数组的索引位置,从而实现快速的查找、插入和删除操作。在散列查找算法中,关键的组成部分是散列函数,它负责将键映射到数组的索引位置。当有多个键映射到同一个索引位置时,会发生冲突,散列查找算法需要解决这些冲突。

散列查找算法的主要优点是查找操作的平均时间复杂度为 O ( 1 ),在理想情况下可以达到常数时间。然而,它也有一些局限性,首先是散列函数的设计需要满足一致性和均匀性的要求,以保证良好的性能。其次,散列查找算法的空间消耗较大,因为需要维护一个数组来存储数据。

2. 哈希表的概念

哈希表是散列查找算法的一种常见应用,它是一种数据结构,用于存储键值对。在哈希表中,通过散列函数将键映射到数组的索引位置,然后将键值对存储在该位置。哈希表的主要优点是查找、插入和删除操作的平均时间复杂度为 O ( 1 ),因此具有快速的查找能力。

哈希表的实现需要解决冲突的问题,当有多个键映射到同一个索引位置时,需要使用链地址法或开放地址法来解决冲突。链地址法将冲突的键值对存储在同一个索引位置的链表中,而开放地址法则在哈希表中寻找下一个可用的空槽来存储冲突的键值对。

3. 哈希集合的概念

哈希集合是一种基于哈希表的集合数据结构,它存储唯一的元素,并支持快速的插入、查找和删除操作。哈希集合使用散列函数将元素映射到数组的索引位置,从而实现快速的查找能力。

哈希集合的实现类似于哈希表,不同之处在于哈希集合只存储键而不存储值。当需要判断元素是否存在于哈希集合中时,可以通过散列函数计算出元素的哈希值,然后查找哈希集合中的索引位置,如果存在则表示元素存在于哈希集合中。

4. 哈希映射的概念

哈希映射是一种基于哈希表的映射数据结构,它存储键值对,并支持快速的插入、查找和删除操作。哈希映射使用散列函数将键映射到数组的索引位置,从而实现快速的查找能力。

哈希映射的实现类似于哈希表,它存储键值对而不仅仅是键。当需要查找或操作键对应的值时,可以通过散列函数计算出键的哈希值,然后查找哈希映射中的索引位置,从而快速地获取键对应的值。

5. 实例演示

现在,让我们通过实例代码来演示哈希表、哈希集合和哈希映射的应用。

实例1:哈希表

class HashTable:
    def __init__(self, size):
        self.size = size
        self.table = [[] for _ in range(size)]

    def _hash_function(self, key):
        return hash(key) % self.size

    def insert(self, key, value):
        index = self._hash_function(key)
        self.table[index].append((key, value))

    def search(self, key):
        index = self._hash_function(key)
        for k, v in self.table[index]:
            if k == key:
                return v
        return None

    def delete(self, key):
        index = self._hash_function(key)
        for i, (k, v) in enumerate(self.table[index]):
            if k == key:
                del self.table[index][i]
                return

# 创建哈希表
hash_table = HashTable(10)

# 添加键值对
hash_table.insert('apple', 2)
hash_table.insert('banana', 3)
hash_table.insert('orange', 4)

# 查找键对应的值
print("apple 对应的值:", hash_table.search('apple'))

# 删除键值对
hash_table.delete('banana')

# 打印哈希表
print("哈希表内容:", hash_table.table)

代码解释:上述代码演示了使用哈希表存储水果名称和对应的数量的实例。我们创建了一个 HashTable 类来表示哈希表,并实现了插入、查找和删除操作。我们通过散列函数将水果名称映射到哈希表的索引位置,并使用链地址法解决冲突,确保键值对正确地存储在哈希表中。

实例2:哈希集合

class HashSet:
    def __init__(self):
        self.hash_set = set()

    def add(self, key):
        self.hash_set.add(key)

    def contains(self, key):
        return key in self.hash_set

    def remove(self, key):
        if self.contains(key):
            self.hash_set.remove(key)

# 创建哈希集合
hash_set = HashSet()

# 添加元素
hash_set.add('apple')
hash_set.add('banana')
hash_set.add('orange')

# 判断元素是否存在
print("apple 存在于集合中:", hash_set.contains('apple'))

# 删除元素
hash_set.remove('banana')

# 打印哈希集合
print("哈希集合内容:", hash_set.hash_set)

代码解释:上述代码演示了使用哈希集合存储水果名称的实例。我们创建了一个 HashSet 类来表示哈希集合,并实现了添加、判断是否存在和删除操作。我们通过散列函数将水果名称映射到哈希集合中,并使用内置的集合数据结构来实现哈希集合的功能。

实例3:哈希映射

class HashMap:
    def __init__(self):
        self.hash_map = {}

    def put(self, key, value):
        self.hash_map[key] = value

    def get(self, key):
        return self.hash_map.get(key, None)

    def remove(self, key):
        if key in self.hash_map:
            del self.hash_map[key]

# 创建哈希映射
hash_map = HashMap()

# 添加键值对
hash_map.put('apple', 2)
hash_map.put('banana', 3)
hash_map.put('orange', 4)

# 获取键对应的值
print("apple 对应的值:", hash_map.get('apple'))

# 删除键值对
hash_map.remove('banana')

# 打印哈希映射
print("哈希映射内容:", hash_map.hash_map)

代码解释:上述代码演示了使用哈希映射存储水果名称和对应的数量的实例。我们创建了一个 HashMap 类来表示哈希映射,并实现了添加、获取和删除操作。我们通过散列函数将水果名称映射到哈希映射中,并使用内置的字典数据结构来实现哈希映射的功能。

总结

本篇博客介绍了散列查找算法的三种常见应用:哈希表、哈希集合和哈希映射。哈希表是一种高效的数据结构,用于存储键值对并支持快速的查找、插入和删除操作。哈希集合是一种存储唯一元素的数据结构,而哈希映射是一种存储键值对的数据结构。

[ 专栏推荐 ]
😃 Python 算法初阶:入门篇》😄
❤️【简介】:本课程是针对 Python 初学者设计的算法基础入门课程,涵盖算法概念、时间复杂度、空间复杂度等基础知识。通过实例演示线性搜索、二分搜索等算法,并介绍哈希表、深度优先搜索、广度优先搜索等搜索算法。此课程将为学员提供扎实的 Python 编程基础与算法入门,为解决实际问题打下坚实基础。

在这里插入图片描述

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

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

相关文章

Spring Cloud 之 Gateway 网关

🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…

Web安全基础

Web安全基础 一、Web应用安全概述1.1、什么是Web应用安全?1.2、WEB应用安全的兴起1.3、常见web应用1.3.1、常见Web应用—前后台 1.4、Web应用安全与传统安全的区别 二、Web应用的基本架构2.1、Web应用的基本架构2.2、Web服务的提供者——Web中间件2.3、简单的Web服务…

javascript实现久久乘法口诀表、document、write、console、log

文章目录 正序乘法口诀表倒序乘法口诀表logconsoledocumentwrite 正序乘法口诀表 function multiplicationTable() {for (let i 1; i < 9; i) {let val ;for (let j 1; j < i; j) {document.write(j * i (i * j) &nbsp );val ${j}*${i}${i * j} ;}consol…

肯尼亚税务局如何利用RPA、AI等创新技术来推动税务合规增加税收?

在当今的数字化时代&#xff0c;税务部门的工作变得日益复杂。依赖手动程序为税务部门带来了巨大的困难&#xff0c;这使得在有效管理税收和实现收入目标上遇到了阻碍。手动流程往往效率低下&#xff0c;易出错&#xff0c;而且难以应对大规模的数据处理需求。如果不能解决该问…

泛在电力物联网、能源互联网与虚拟电厂

导读&#xff1a;从能源互联网推进受阻&#xff0c;到泛在电力物联网名噪一时&#xff0c;到虚拟电厂再次走向火爆&#xff0c;能源领域亟需更进一步的数智化发展。如今&#xff0c;随着新型电力系统建设推进&#xff0c;虚拟电厂有望迎来快速发展。除了国网和南网公司下属的电…

【Redis-01】Redis的五种数据类型

Redis五种数据类型 1.String1.1特点1.2命令1.3实例 2.Hash2.1特点2.2命令2.3实例 3.List3.1特点3.2命令3.3实例 4.Set4.1特点4.2命令4.3实例 5. SortedSet5.1特点5.2命令5.3实例 1.String 1.1特点 String类型&#xff0c;也就是字符串类型&#xff0c;是Redis中最简单的存储类…

harbor仓库故障排除

harbor仓库无法用docker login登录&#xff0c;一直报x509: cannot validate certificate for 172.17.10.29 because it doesn’t contain any IP SANs 1、检查docker和harbor的服务是否启动 [rootk8s-harbor harbor]#systemctl status harbor.service [rootk8s-harbor harbo…

应对突发流量,如何快速为自建 K8s 添加云上弹性能力

作者&#xff1a;庄宇 以 Kubernetes 为代表的容器技术带来的是一种应用交付模式的变革&#xff0c;其正迅速成为全世界数据中心的统一 API。 为了保证业务持续稳定、用户访问不中断&#xff0c;高可用、高弹性等能力是应用架构设计不变的追求&#xff0c;多集群架构天然具备…

控制对文件访问

控制对文件访问 Linux文件权限 权限文件影响目录影响r读取文件内容列出目录内容w更改文件内容创建删除目录文件x作为命令执行目录可以变成当前工作目录 命令行管理文件系统权限 更改文件和目录权限 chmod chmod WhoWhatWhich file|directoryWho (u,g,o,a代表用户&#xff…

抖音seo源码搭建,抖音矩阵系统源码分发,抖音矩阵账号管理系统

前言&#xff1a; 抖音seo源码&#xff0c;抖音矩阵系统源码搭建&#xff0c;抖音矩阵同步分发。抖音seo源码部署是需要对接到这些正规接口再来做开发的&#xff0c;目前账号矩阵程序开发的功能&#xff0c;围绕一键管理多个账号&#xff0c;做到定时投放&#xff0c;关键词自动…

C# 提示:无法加载 DLL“XXX.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。

今天再调试程序时发现程序再笔记本上运行正常&#xff0c;然而拷贝到客户主机上之后出现了&#xff08;System.DllNotFoundException: 无法加载 DLL“msc.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。&#xff09;的问题&#xff0c;经过再三调试&#xff0c; …

python编程语言之数据类型

python数据类型 https://draw.io/ 画图 str 序列操作 字符串属于序列类型&#xff0c;所谓序列&#xff0c;指的是一块可存放多个值的连续内存空间&#xff0c;这些值按一定顺序排列&#xff0c;可通过每个值所在位置的编号&#xff08;称为索引、下标&#xff09;访问它们…

6.3.3 利用Wireshark进行协议分析(三)Wireshark基本操作

6.3.3 利用Wireshark进行协议分析&#xff08;三&#xff09; 一、启动Wireshark界面 如图 从上到下依次是 标题栏菜单栏工具栏过滤栏捕获窗口&#xff0c;在该区域用户可以选择网络接口&#xff0c;设置捕获选项 Wireshark允许用户将捕获到的数据包信息保存在指定的文件中…

ESD门禁闸机管理系统如何适应不同场景及需求

ESD门禁闸机是一种用于控制进出门禁区域的设备。ESD是英文Electrostatic Discharge的缩写&#xff0c;意指静电放电。该门禁闸机主要用于防止静电对敏感设备和产品造成的损害。 ESD门禁闸机具有以下功能和特点&#xff1a; 1. 静电防护&#xff1a;ESD门禁闸机使用特殊的材料…

前端Vue uni-app App/小程序/H5 通用tree树形结构图

随着技术的发展&#xff0c;开发的复杂度也越来越高&#xff0c;传统开发方式将一个系统做成了整块应用&#xff0c;经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改&#xff0c;造成牵一发而动全身。 通过组件化开发&#xff0c;可以有效实现…

【源码解析】一张图了解spring内部原理

从Spring框架流程上来看主要包含的是Bean对象的配置&#xff0c;读取配置&#xff0c;Bean工厂管理&#xff0c;构建对象。

Panabit iXCache后台命令执行

在我们短促而又漫长的一生中&#xff0c;我们在苦苦地寻找人生的幸福&#xff0c;可幸福往往又与我们失之交臂。当我们为此而耗尽宝贵的青春年华&#xff0c;皱纹也悄悄地爬上了眼角的时候&#xff0c;我们或许才能稍稍懂得生活实际上意味着什么。 漏洞描述 Panabit iXCache指…

三、图形化界面工具DataGrip

一、DataGrip软件下载 1、官网下载 官网地址&#xff1a;https://www.jetbrains.com/zh-cn/ 拉到主页面的最下面&#xff1a; 2、下载DataGrip软件 二、软件安装 1、双击安装包 2、进入安装界面&#xff0c;点击【Next】 3、选择安装路径&#xff0c;之后点击【Next】 尽量不…

uni-app 小程序 uni.showToast字数超过两行自动省略显示不全问题

如图&#xff1a; uni.showToast({title: res.data.msg,icon: "none" });uni.showToast() 显示消息提示框&#xff0c;显示图标时&#xff0c; title 文本最多显示 7 个汉字长度&#xff0c;在不显示图标的情况下&#xff0c;大于两行不显示。 可以选择更换为使用…

霍格沃兹emp.dll文件丢失要怎么处理?快速修复emp.dll的方法

最近有朋友反映在他们玩霍格沃兹的时候&#xff0c;突然弹出一个emp.dll文件丢失的窗口&#xff0c;然后就玩不了游戏了&#xff0c;那么面对这种情况要怎么去解决呢&#xff1f;其实解决方法还是有挺多的&#xff0c;下面我们一起来了解一下吧。 一.emp.dll文件有什么作用 e…