[Hello算法02]数据结构,哈希表,哈希冲突
📅 2026/7/14 23:22:08
👁️ 次浏览
本文为书籍 《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是哈希表的一个重要概念其定义为哈希表的元素数量除以桶数量用于衡量哈希冲突的严重程度也常作为哈希表扩容的触发条件。
1. 项目概述:为什么我们需要一本关于string的“全面指南”?在C的日常开发中,std::string可能是我们最熟悉、使用频率最高的类之一。从简单的日志打印、用户输入处理,到复杂的文本解析、数据序列化,几乎无处不在。正因为…
📅 2026/7/14 23:21:08
电流互感器能测直流吗?不能。电流检测互感器(CST)靠磁通变化感应输出,只对交流和脉冲电流有响应;纯直流的磁通不变化,二次没有输出,而且直流磁通会单向累积,很快把磁芯推饱和。要测直…
📅 2026/7/14 23:21:08
1. 项目概述:高精度数据采集系统设计在工业自动化、环境监测和医疗设备等领域,高精度数据采集系统扮演着至关重要的角色。MCP3551作为一款22位Δ-Σ型模数转换器(ADC),与PIC18F26K22微控制器的组合,为工程师提供了一种经济高效的高…
📅 2026/7/14 23:21:08
【LINUX驱动】【字符设备】【中断】【Platform】【网课 设备树】【GPIO】【PINCTRL】【INPUT】【IIC】【SPI】【网络驱动】【屏幕驱动】【一 设备树】【二 内核模块编译】【三 基本驱动框架】【四 Platform总线设备驱动框架】【五 驱动子系统】【六 综合】
📅 2026/7/15 0:08:20
🔍 数据简介
本次分享1985-2026年全球土壤侵蚀多因子栅格数据集,覆盖K/R/C/P/L/S/SC等核心因子,适配RUSLE/CSLE模型,全球全覆盖、多年份连续,分辨率10m–1km可选,直接用于土壤侵蚀模数计算与水土保持研究。…
📅 2026/7/15 0:07:20
🔍 数据简介
本次分享1980-2025年全国30m分辨率土地利用/土地覆盖栅格数据(CNLUCC),由中科院地理科学与资源研究所研制,权威基准数据。
数据覆盖全国全域,分为两个标准版本,并已更新至2023/2025…
📅 2026/7/15 0:07:20
🔍 数据简介
本次分享1979-2026年全国1km分辨率GDP空间分布栅格数据,由中科院资源环境科学数据中心研制,权威可靠。
数据集覆盖全国全域,1992-2019年逐年完整,关键年份(1995/2000/2005/2010/2015/2019/2020…
📅 2026/7/15 0:07:20
🔍 数据简介
本次分享1975-2026年全国高精度水系水路矢量数据,覆盖全国全域,包含河流、水系、水库、运河、湿地、冰川、沟渠等全类别水文要素。
数据集包含双层矢量图层,字段分类清晰、要素齐全,支持2013-2026逐年完整…
📅 2026/7/15 0:07:20
🔍 数据简介
本次分享1982-2026年全国村级精度建筑轮廓矢量数据,覆盖全国各省市区县,到村级别精细,为2026年最新实时采集成果,非网传仅60/77个城市的老旧数据。
数据含带高度/不带高度双版本,单体建筑边界精…
📅 2026/7/15 0:07:20
1. COM线程模型基础与CoInitializeEx核心作用在Windows平台开发中,组件对象模型(COM)的线程处理机制一直是开发者必须掌握的底层知识。作为COM初始化的门户函数,CoInitializeEx不仅决定了对象在何种线程环境下运行,更影响着整个组件的并发性能…
📅 2026/7/15 0:00:17
1. 为什么M芯片Mac用户需要降级到Monterey? 去年刚拿到M2芯片的MacBook Pro时,我第一时间升级到了Ventura系统。结果第三天就遇到了微信闪退、Final Cut Pro渲染卡顿的问题。后来在开发者论坛发现,不少专业软件对Ventura的适配都存在问题。这…
📅 2026/7/15 0:00:17
1. 背景与核心概念在AI大模型快速发展的今天,许多开发者和研究者都面临一个现实问题:如何在有限的硬件预算下实现高效的本地大模型部署。特别是对于个人开发者和小型团队来说,购买最新的高端显卡成本高昂,而利用现有的或二手硬件资…
📅 2026/7/15 0:00:17
豆包openclaw最近圈子里都在聊豆包openclaw,我也没忍住,掏腰包入手了一套。说实话,刚拿到手的时候,心里是打鼓的。毕竟市面上类似的智能硬件太多了,有的吹得天花乱坠,用起来却是一堆bug。为了不让大家的钱打水漂,我连续用了半个月。从开箱到日常高频使用,甚至故意测试它…
📅 2026/7/14 6:35:02
SQLyog 13.3.1 社区版在Windows 10/11上的完整安装与连接指南 对于刚接触MySQL数据库管理的开发者和学生来说,选择一个直观易用的图形化管理工具至关重要。SQLyog作为一款轻量级但功能强大的MySQL GUI工具,能够显著提升数据库操作的效率和体验。本文将详…
📅 2026/7/14 12:06:52
SPEC CPU 2006 跨平台基准测试深度实战:ARM/X86/MIPS 架构配置优化与结果分析方法论在当今多元化的计算架构时代,如何客观评估不同处理器平台的真实性能成为系统工程师和性能优化专家的核心挑战。SPEC CPU 2006 作为业界公认的计算密集型基准测试套件&am…
📅 2026/7/14 7:15:18
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/14 15:11:56
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/13 19:47:36
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/14 15:11:56