当前位置: 首页 > news >正文

数据结构编程实践20讲(Python版)—18哈希表

本文目录

    • 18 哈希表(Hash Table)
      • S1 说明
        • 特征
        • 解决问题
      • S2 示例
        • 示例 1
        • 示例 2
      • S3 应用
        • 应用1: LRU 缓存机制
        • 应用2:高级拼写检查器
        • 应用3:DNA 序列的 K-mer 计数

往期链接

01 数组02 链表03 栈04 队列05 二叉树06 二叉搜索树07 AVL树08 红黑树09 B树10 B+树
11 线段树12 树状数组13 图形数据结构14 邻接矩阵15 完全图16 有向图17 散列

18 哈希表(Hash Table)

S1 说明

哈希表(Hash Table)是一种用于存储键值对的数据结构,通过哈希函数将键映射到数组的索引位置,从而实现快速的查找、插入和删除操作。哈希表的基本思想是将数据存储在一个数组中,并使用哈希函数计算每个元素的存储位置。

特征
  • 快速查找:
    哈希表的查找、插入和删除操作的平均时间复杂度为 O ( 1 ) O(1) O(1),在最坏情况下为 O ( n ) O(n) O(n),但通过良好的哈希函数和冲突解决策略,可以保持接近 O ( 1 ) O(1) O(1)的性能。
  • 键唯一性:
    在哈希表中,每个键都是唯一的。若插入相同的键,则会更新其对应的值。
  • 哈希函数:
    哈希函数将键转换为数组索引。一个好的哈希函数应该能够均匀分布键,减少冲突的发生。
  • 冲突解决:
    当不同的键映射到相同的索引时,会发生冲突。常用的冲突解决方法有链式地址法(使用链表存储同一索引的多个元素)和开放地址法(寻找下一个空位)。
  • 动态扩展:
    当哈希表装载因子(存储的元素数量与数组大小的比率)超过某个阈值时,通常会进行扩展,以保持高性能。
解决问题

哈希表可以解决许多实际问题,包括但不限于:

  • 缓存:使用哈希表存储计算结果或频繁访问的数据,实现快速访问。
  • 数据去重:通过哈希表存储已访问的数据,快速判断新数据是否为重复。
  • 频率统计:在字典或集合中存储数据频率,便于快速查找和更新。
  • 索引建立:在数据库中使用哈希表建立索引,提高数据检索速度。
  • 密码存储:在用户认证中,使用哈希表存储用户信息,提高查找效率。

S2 示例

示例 1
class Person:def __init__(self, name, age):self.name = nameself.age = agedef __hash__(self):"""自定义哈希函数,将名字和年龄结合起来生成哈希值"""return hash((self.name, self.age))def __eq__(self, other):"""比较两个对象是否相等"""if isinstance(other, Person):return self.name == other.name and self.age == other.agereturn False# 创建一些对象
person1 = Person("敖耳散", 30)
person2 = Person("包而嗣", 25)
person3 = Person("敖耳散", 30)# 使用哈希值
print(f"Hash of person1: {hash(person1)}")
print(f"Hash of person2: {hash(person2)}")
print(f"Hash of person3: {hash(person3)}")# 比较对象
print(f"person1 == person3: {person1 == person3}")  # 输出: True
print(f"person1 == person2: {person1 == person2}")  # 输出: False# 使用对象作为字典的键
person_dict = {person1

相关文章:

数据结构编程实践20讲(Python版)—18哈希表

本文目录 18 哈希表(Hash Table)S1 说明特征解决问题S2 示例示例 1示例 2S3 应用应用1: LRU 缓存机制应用2:高级拼写检查器应用3:DNA 序列的 K-mer 计数往期链接 01 数组02 链表03 栈04 队列05 二叉树06 二叉搜索树07 AVL树08 红黑树09 B树10 B+树11 线段树12 树状数组13 …...

Html 标题加图标

每个网页选项卡都有一个图标&#xff1a; <meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>主页</title><link rel"icon" href"images/记事本.png&…...

机器学习探索性数据分析 (EDA)

机器学习探索性数据分析 (EDA) 探索性数据分析&#xff08;Exploratory Data Analysis, EDA&#xff09;是机器学习工作流中至关重要的一个步骤&#xff0c;通过深入分析和理解数据的结构、分布和相关性&#xff0c;EDA帮助揭示数据背后的故事&#xff0c;并为后续的建模提供有…...

【K8S系列】Kubernetes pod节点Pending或CrashLoopBackOff 问题及解决方案详解【已解决】

在 Kubernetes 中&#xff0c;Pod 是最小的可调度单元&#xff0c;负责运行容器。当 Pod 的状态显示为 Pending 或 CrashLoopBackOff 时&#xff0c;意味着它无法成功启动或持续崩溃。本文将详细分析这两种状态的原因、排查步骤、执行后的结果及相应的解决方案。 一、Pod 状态概…...

【Redis】Zset类型常用命令

文章目录 一. Zset有序集合简介.二. 添加元素相关命令.2.1 向有序集合中添加元素(zadd) 三. 查询元素相关操作.3.1 查询有序集合中的元素个数( zcard zcount)3.2 查询指定区间内的元素(zrange zrevrange zrangebyscore)3.3 查询有序集合中指定成员的排名(zrank zrevrank )3.4 查…...

js中map,filter,find,foreach的用法介绍

js中map&#xff0c;filter&#xff0c;find&#xff0c;foreach的用法介绍 在 JavaScript 中&#xff0c;数组提供了一些常用的迭代方法&#xff0c;如 map、filter、find 和 forEach&#xff0c;这些方法允许你对数组中的每个元素进行操作&#xff0c;下面是它们的用法和区别…...

Linux 重置 root 密码

如果您在Linux系统中忘记了root密码&#xff0c;可以按照以下步骤重置&#xff1a; 重启系统。在启动时&#xff0c;当GRUB菜单出现时&#xff0c;选择要启动的内核版本&#xff0c;然后按 e 键编辑启动选项。找到以linux或linux16开头的行&#xff0c;它包含了启动内核的命令…...

【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的停车场管理系统

开题报告 随着城市化进程不断加快&#xff0c;汽车保有量持续增长&#xff0c;城市停车问题日益凸显&#xff0c;传统停车场管理手段面临着诸多挑战&#xff0c;诸如管理效率低、人工成本高、信息更新滞后、收费不透明等问题。鉴于此&#xff0c;基于 Web 的智能停车场管理系统…...

博睿数据首届“观测先锋 · 2024 可观测平台创新应用案例大赛”现已启动!

大赛报名火热进行中&#xff01; 在当今这个数字化、智能化的时代&#xff0c;可观测性技术已经成为企业IT架构中不可或缺的一部分。它能够帮助企业实时监控系统的运行状态&#xff0c;及时发现并解决潜在问题&#xff0c;从而确保业务的稳定性和连续性。博睿数据一体化智能可观…...

笔记:SOME/IP-SD报文中的TTL

问&#xff1a;SOME/IP-SD报文中有几个参数名字都叫的TTL&#xff0c;请问它们有什么不同&#xff1f; 答&#xff1a;在SOME/IP Service Discovery (SOME/IP-SD)协议中&#xff0c;确实有多个与TTL&#xff08;Time-To-Live&#xff09;相关的参数&#xff0c;但它们的含义不…...

9.存储过程安全性博客大纲(9/10)

存储过程安全性博客大纲 引言 在数据库系统中&#xff0c;存储过程是一种预先编写好的SQL代码集合&#xff0c;它被保存在数据库服务器上&#xff0c;可以通过指定的名称来调用执行。存储过程可以包含一系列的控制流语句&#xff0c;如IF条件语句、WHILE循环等&#xff0c;使…...

android 打包成aar

1 先建立的空白新工程&#xff08;不能有activity&#xff0c;直接建立No Activity的项目就行&#xff09; 2 建立新library 3 填写自己的内容 4 5 如果代码有红色提示的错误&#xff0c;会提示打包失败&#xff0c;修改红色的错误提示就行...

服务器和中转机在网络安全方面

服务器和中转机&#xff08;代理服务器&#xff09;在网络安全方面扮演着不同的角色&#xff0c;各自承担着保护网络资源和控制网络访问的重要职责。 它们在网络安全方面的主要作用&#xff1a; 服务器在网络安全中的角色 1.服务保护&#xff1a; 服务器通常运行着各种网络…...

解决“无法从 System.String 强制转换或转换为 Class 对象”错误

解决“无法从 System.String 强制转换或转换为 Class 对象”错误 在进行 API 自动化时&#xff0c;我必须反序列化响应以解析 API 响应数据。我们使用 Newtonsoft.Json NuGet 来实现这一点。 我在反序列化过程中遇到以下错误 - Newtonsoft.Json.JsonSerializationExceptionH…...

Git:LF will be replaced by CRLF、pytest PermissionError以及Git应用中的一些问题解决及一些使用技巧

一、Git:LF will be replaced by CRLF和pytest: --cov NTERNALERROR PermissionError 1. git warning: LF will be replaced by CRLF in ***file 偶然git add在进行代码提交的时候碰到警告warning: LF will be replaced by CRLF in ***file&#xff0c;原因是编辑的代码内容中…...

云原生之运维监控实践-使用taosKeeper与TDinsight实现对TDengine服务的监测告警

背景 如果没有监控&#xff0c;那么最好的情况是没有问题发生&#xff0c;最糟糕的情况则是问题发生了但没有被发现。——《Prometheus监控实战》 在10月10日收到了 TDengine 官方微信公众号的一条推送&#xff0c;摘要如下&#xff1a; 今天(2024年10月10日)我们非常高兴地宣布…...

前端js,vue系统使用iframe嵌入第三方系统的父子系统的通信

前端js,vue系统使用iframe嵌入第三方系统的父子系统的通信 1&#xff0c;父子系统之间的通信问题 父系统给子系统传值可通过postMessage方式进行通信,postMessage(“传递的数据”,url) 1.1 父系统给子系统的传值 let iframe document.getElementById(childFrame); let o1 {…...

树莓派刷入OpenWrt后扩容overlay的方法

问题&#xff1a; 128G的SD卡刷入openwrt后发现可用空间不足100M&#xff08;我用的squashfs固件&#xff0c;ext4也存在同样的问题&#xff0c;但能否用此方法需要自己尝试一下&#xff09;。 rootOpenWrt:~# df -h Filesystem Size Used Available Use%…...

【JS】Node.js读取execle表格中的数据

在Node.js中读取.xlsx格式的Excel文件&#xff0c;可以使用xlsx库。这个库非常流行且易于使用。下面是一个基本示例&#xff0c;展示如何使用xlsx库读取.xlsx文件中的数据。 首先&#xff0c;你需要安装xlsx库。你可以使用npm来安装&#xff1a; npm install xlsx然后&#x…...

怎么为pdf文件设置密码?几种PDF文件设置密码的方法推荐

怎么为pdf文件设置密码&#xff1f;设置PDF文件密码&#xff0c;正是应对这一挑战的有效手段之一。通过为PDF文件设置密码&#xff0c;我们能够为文档加上一道安全锁&#xff0c;确保只有掌握密码的用户才能打开和查看文件内容。这一措施不仅保护了文档的隐私性&#xff0c;还防…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...