[Hello算法02]数据结构,哈希表,哈希冲突
本文为书籍 《Hello算法》学习笔记原书链接Hello 算法本文仅作学习记录及分享一、数据结构常见的数据结构包括数组、链表、栈、队列、哈希表、树、堆、图它们可以从“逻辑结构”和“物理结构”两个维度进行分类。数据结构可以从逻辑结构和物理结构两个角度进行分类。逻辑结构描述了数据元素之间的逻辑关系而物理结构描述了数据在计算机内存中的存储方式。常见的逻辑结构包括线性、树状和网状等。通常我们根据逻辑结构将数据结构分为线性数组、链表、栈、队列和非线性树、图、堆两种。哈希表的实现可能同时包含线性数据结构和非线性数据结构。链表在初始化后仍可以在程序运行过程中对其长度进行调整因此也称“动态数据结构”。数组在初始化后长度不可变因此也称“静态数据结构”。值得注意的是数组可通过重新分配内存实现长度变化从而具备一定的“动态性”。物理结构主要分为连续空间存储数组和分散空间存储链表。所有数据结构都是由数组、链表或两者的组合实现的。哈希表同时包含线性数据结构和非线性数据结构是因为哈希表底层是数组而为了解决哈希冲突我们可能会使用“链式地址”后续“哈希冲突”章节会讲数组中每个桶指向一个链表当链表长度超过一定阈值时又可能被转化为树通常为红黑树。从存储的角度来看哈希表的底层是数组其中每一个桶槽位可能包含一个值也可能包含一个链表或一棵树。因此哈希表可能同时包含线性数据结构数组、链表和非线性数据结构树。二、哈希表# 初始化哈希表 hmap: dict {} # 添加操作 # 在哈希表中添加键值对 (key, value) hmap[12836] 小哈 hmap[15937] 小啰 hmap[16750] 小算 hmap[13276] 小法 hmap[10583] 小鸭 # 查询操作 # 向哈希表中输入键 key 得到值 value name: str hmap[15937] # 删除操作 # 在哈希表中删除键值对 (key, value) hmap.pop(10583)遍历方式# 遍历哈希表 # 遍历键值对 key-value for key, value in hmap.items(): print(key, -, value) # 单独遍历键 key for key in hmap.keys(): print(key) # 单独遍历值 value for value in hmap.values(): print(value)在哈希表中我们将数组中的每个空位称为桶bucket每个桶可存储一个键值对。因此查询操作就是找到key对应的桶并在桶中获取value。在哈希表中输入空间是所有key输出空间是所有桶数组索引。换句话说输入一个key 我们可以通过哈希函数得到该key对应的键值对在数组中的存储位置。输入一个key哈希函数的计算过程分为以下两步。通过某种哈希算法hash()计算得到哈希值。将哈希值对桶数量数组长度capacity取模从而获取该key对应的桶数组索引index。哈希函数工作原理class Pair: 键值对 def __init__(self, key: int, val: str): self.key key self.val val class ArrayHashMap: 基于数组实现的哈希表 def __init__(self): 构造方法 # 初始化数组包含 100 个桶 self.buckets: list[Pair | None] [None] * 100 def hash_func(self, key: int) - int: 哈希函数 index key % 100 return index def get(self, key: int) - str | None: 查询操作 index: int self.hash_func(key) pair: Pair self.buckets[index] if pair is None: return None return pair.val def put(self, key: int, val: str): 添加和更新操作 pair Pair(key, val) index: int self.hash_func(key) self.buckets[index] pair def remove(self, key: int): 删除操作 index: int self.hash_func(key) # 置为 None 代表删除 self.buckets[index] None def entry_set(self) - list[Pair]: 获取所有键值对 result: list[Pair] [] for pair in self.buckets: if pair is not None: result.append(pair) return result def key_set(self) - list[int]: 获取所有键 result [] for pair in self.buckets: if pair is not None: result.append(pair.key) return result def value_set(self) - list[str]: 获取所有值 result [] for pair in self.buckets: if pair is not None: result.append(pair.val) return result def print(self): 打印哈希表 for pair in self.buckets: if pair is not None: print(pair.key, -, pair.val)三、哈希冲突从本质上看哈希函数的作用是将所有key构成的输入空间映射到数组所有索引构成的输出空间而输入空间往往远大于输出空间。因此理论上一定存在“多个输入对应相同输出”的情况。我们将这种多个输入对应同一输出的情况称为哈希冲突hash collision。哈希表容量越大多个key被分配到同一个桶中的概率就越低冲突就越少。因此我们可以通过扩容哈希表来减少哈希冲突。负载因子load factor是哈希表的一个重要概念其定义为哈希表的元素数量除以桶数量用于衡量哈希冲突的严重程度也常作为哈希表扩容的触发条件。

相关新闻

高精度数据采集系统设计:MCP3551与PIC18F26K22应用指南

高精度数据采集系统设计:MCP3551与PIC18F26K22应用指南

1. 项目概述:高精度数据采集系统设计在工业自动化、环境监测和医疗设备等领域,高精度数据采集系统扮演着至关重要的角色。MCP3551作为一款22位Δ-Σ型模数转换器(ADC),与PIC18F26K22微控制器的组合,为工程师提供了一种经济高效的高…

2026/7/14 23:18:45 阅读更多 →
AI Agent Skills实战:流程封装与复用技术详解

AI Agent Skills实战:流程封装与复用技术详解

1. Agent Skills入门:把重复流程封装成可复用的能力包最近在AI领域,Agent Skills这个概念越来越火。简单来说,它就是把那些你每天要重复操作的流程打包成一个"技能包",下次要用的时候直接调用就行。就像你手机里的快捷指…

2026/7/14 23:16:44 阅读更多 →
工业负载控制:TPD2017FN与PIC18LF45K50的智能解决方案

工业负载控制:TPD2017FN与PIC18LF45K50的智能解决方案

1. 工业负载控制的核心挑战与方案选型在工业自动化现场,电感和电阻负载的控制一直是工程师面临的棘手问题。去年我在某汽车零部件生产线升级项目中,就曾遇到过电磁阀频繁烧毁的故障——这正是由于感性负载的反电动势没有得到妥善处理。经过多次试验&…

2026/7/14 23:16:44 阅读更多 →

最新新闻

【1975-2026】全国水系水路数据|河流/水库/运河|SHP矢量

【1975-2026】全国水系水路数据|河流/水库/运河|SHP矢量

🔍 数据简介 本次分享1975-2026年全国高精度水系水路矢量数据,覆盖全国全域,包含河流、水系、水库、运河、湿地、冰川、沟渠等全类别水文要素。 数据集包含双层矢量图层,字段分类清晰、要素齐全,支持2013-2026逐年完整…

2026/7/15 0:07:01 阅读更多 →
行星减速机为什么能提高扭矩?从功率守恒到输出扭矩校核

行星减速机为什么能提高扭矩?从功率守恒到输出扭矩校核

一、为什么减速以后扭矩会增大 旋转机械的功率、转速和扭矩之间存在以下关系: T 9550 P n 其中: T为扭矩,单位Nm; P为功率,单位kW; n为转速,单位r/min。 在功率基本不变的情况下:…

2026/7/15 0:03:00 阅读更多 →
YOLO26 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

YOLO26 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

前言 本文介绍了面向复杂背景小目标检测的时空特征融合模块——STFFM。该模块通过空间分支与时间/运动分支的特征拼接,引入通道注意力和空间注意力对融合特征进行自适应筛选,并结合残差增强与通道压缩,突出目标区域、抑制背景噪声。我们将 S…

2026/7/15 0:01:00 阅读更多 →
YOLO11 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

YOLO11 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

前言 本文介绍了面向红外小目标检测的时空特征融合模块——STFFM,用于增强复杂背景下目标与噪声、杂波的区分能力。该方法通过拼接空间特征与时间/运动特征,并结合通道注意力、空间注意力和残差增强机制,实现对关键语义通道与疑似目标区域的…

2026/7/15 0:01:00 阅读更多 →
数字电路时序控制:基于74LS193的八路流水灯Multisim仿真与优化

数字电路时序控制:基于74LS193的八路流水灯Multisim仿真与优化

1. 74LS193计数器与流水灯控制基础74LS193是一款经典的4位同步可逆计数器芯片,在数字电路设计中扮演着重要角色。我第一次接触这个芯片是在大学电子实验课上,当时用它做了一个简单的二进制计数器。没想到十年后,我依然会在各种时序控制项目中…

2026/7/14 23:58:57 阅读更多 →
Java接入大模型的4个坑和生产级框架实践

Java接入大模型的4个坑和生产级框架实践

本文梳理Java接入大模型时踩过的4个坑,以及用框架解决这些问题的工程实践。 第一个坑:连接池打满 大模型API的响应时间在2到8秒,远高于传统REST API的百毫秒级响应。用默认连接池配置,并发量稍微上来就会打满连接。 某制造企业的实…

2026/7/14 23:54:56 阅读更多 →

日新闻

YOLO11 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

YOLO11 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

前言 本文介绍了面向红外小目标检测的时空特征融合模块——STFFM,用于增强复杂背景下目标与噪声、杂波的区分能力。该方法通过拼接空间特征与时间/运动特征,并结合通道注意力、空间注意力和残差增强机制,实现对关键语义通道与疑似目标区域的…

2026/7/15 0:01:00 阅读更多 →
YOLO26 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

YOLO26 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

前言 本文介绍了面向复杂背景小目标检测的时空特征融合模块——STFFM。该模块通过空间分支与时间/运动分支的特征拼接,引入通道注意力和空间注意力对融合特征进行自适应筛选,并结合残差增强与通道压缩,突出目标区域、抑制背景噪声。我们将 S…

2026/7/15 0:01:00 阅读更多 →
行星减速机为什么能提高扭矩?从功率守恒到输出扭矩校核

行星减速机为什么能提高扭矩?从功率守恒到输出扭矩校核

一、为什么减速以后扭矩会增大 旋转机械的功率、转速和扭矩之间存在以下关系: T 9550 P n 其中: T为扭矩,单位Nm; P为功率,单位kW; n为转速,单位r/min。 在功率基本不变的情况下:…

2026/7/15 0:03:00 阅读更多 →

周新闻

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨 在一个阳光明媚的上午,互联网大厂的面试官坐在桌前,准备迎接他的面试候选人——燕双非,一个以搞笑和幽默著称的程序员。第一轮提问 面试官:燕双非,作…

2026/7/14 16:53:23 阅读更多 →
车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估在智能驾驶和车联网技术快速发展的今天,车载以太网作为新一代车载网络的核心传输技术,其物理层性能直接决定了数据传输的可靠性和稳定性。1000BASE-T1作为当前主流的…

2026/7/14 14:00:13 阅读更多 →
VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战指南嵌入式开发领域正经历一场工具链的静默革命。当传统Keil用户首次打开VSCode的扩展市场搜索EIDE时,往往会惊讶于这个看似简单的插件竟能重构十余年的开发习惯。本文将揭示如何用五个精准步骤&#xff0…

2026/7/14 7:15:24 阅读更多 →

月新闻