可视化图解算法64:哈希表基础

news/2025/10/16 15:28:19/文章来源:https://www.cnblogs.com/jiangzhou/p/19145774

哈希表(Hash table),也被称为散列表,是一种基于哈希函数的数据结构,它通过把关键值(Key value)映射到表中一个位置来访问记录,从而加快查找的速度

当我们想使用哈希法来解决问题的时候,我们一般会选择如下2种数据结构:

  1. map(映射)
  2. set(集合)

1. map(映射)

64-1

64-2

2. set(集合)

64-3

64-4

3. map使用示例

3.1 golang使用示例

package mainimport ("fmt""sync"
)func main() {// 创建并操作 mapuser := map[string]interface{}{"name":   "Bob","age":    25,"skills": []string{"Go", "Python"},}// 类型断言获取值if age, ok := user["age"].(int); ok {user["age"] = age + 1}// 删除字段delete(user, "skills")// 并发安全操作var wg sync.WaitGroupvar mu sync.Mutexcounter := make(map[int]int)for i := 0; i < 10; i++ {wg.Add(1)go func(i int) {defer wg.Done()mu.Lock()counter[i] = i * 2mu.Unlock()}(i)}wg.Wait()fmt.Println(user)    // 输出: map[age:26 name:Bob]fmt.Println(counter) // 输出类似: map[0:0 1:2 ... 9:18]
}

注意事项:

  1. Map 的键必须是可比较类型(不能是 slice、map、function)
  2. 每次遍历顺序随机(Go 故意设计的特性)
  3. 大数据量时优先预分配空间:make(map[string]int, 1000)
  4. 值可以是任意类型,包括另一个 map
  5. 查询不存在的键不会报错,返回零值

3.2 Java使用示例

import java.util.*;public class Main {public static void main(String[] args) {// 创建并操作 MapMap<String, Object> user = new HashMap<>();user.put("name", "Bob");user.put("age", 25);user.put("skills", new String[]{"Java", "Python"});// 类型安全访问if (user.get("age") instanceof Integer age) {user.put("age", age + 1);}// 删除元素user.remove("skills");// 并发安全示例Map<Integer, Integer> counter = new ConcurrentHashMap<>();List<Thread> threads = new ArrayList<>();for (int i = 0; i < 10; i++) {final int num = i;threads.add(new Thread(() -> {counter.put(num, num * 2);}));}threads.forEach(Thread::start);threads.forEach(t -> {try { t.join(); } catch (InterruptedException e) {}});System.out.println(user);    // 输出: {name=Bob, age=26}System.out.println(counter); // 输出: {0=0, 1=2, ..., 9=18}}
}

注意事项:

  1. 键的类型:必须正确实现 equals()hashCode() 方法
  2. 空值处理HashMap 允许 null 键和 null 值,Hashtable 不允许
  3. 有序性选择
    • HashMap:无序
    • LinkedHashMap:按插入顺序
    • TreeMap:按键的自然顺序排序
  4. 线程安全
    • 非并发场景用 HashMap
    • 高并发场景用 ConcurrentHashMap

3.3 Python使用示例

# 创建并操作字典
inventory = {"apples": 50,"bananas": 25,"oranges": 30
}# 更新库存
def add_stock(item, quantity):inventory[item] = inventory.get(item, 0) + quantityadd_stock("apples", 20)
add_stock("pears", 40)# 生成报告
print("Current Inventory:")
for item, qty in inventory.items():print(f"- {item.capitalize():<8}: {qty:03d} units")# 删除低库存项
low_stock = [item for item, qty in inventory.items() if qty < 30]
for item in low_stock:del inventory[item]print("\nFinal Inventory:", inventory)

输出结果

Current Inventory:
- Apples  : 070 units
- Bananas : 025 units
- Oranges : 030 units
- Pears   : 040 unitsFinal Inventory: {'apples': 70, 'oranges': 30, 'pears': 40}

注意事项:

  1. 键的类型要求
    • 必须是可哈希类型(不可变类型:str/int/tuple 等)
    • 值可以是任意类型
  2. 有序性
    • Python 3.7+ 中字典保持插入顺序
    • 使用 collections.OrderedDict 获取更严格的有序保证
  3. 性能特性
    • 查找时间复杂度 O(1)
    • 不要用 dict 替代类(应使用 dataclass 或自定义类)
  4. 内存优化
    • 使用 sys.getsizeof() 查看字典内存占用
    • 对大量数据考虑使用 __slots__ 或第三方库(如 numpy
  5. 常见陷阱
    • 避免在遍历时修改字典结构
    • 不要用可变对象(如 list)作为键
    • None 可以作为键值

3.4 对比

特性 Python Go Java
初始化语法 {k: v}dict() make(map[K]V) new HashMap<>()
空值处理 get(key, default) 返回零值 getOrDefault
有序性 Python 3.7+ 保持插入顺序 无序 可选有序实现
并发安全 需手动加锁 sync.Map ConcurrentHashMap
默认值处理 setdefault/defaultdict 需手动判断 computeIfAbsent

今日佳句:问渠那得清如许?为有源头活水来。

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

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

相关文章

2025 防火/模压/瓦楞/大跨距/热镀锌/热浸锌/不锈钢/光伏/铝合金/锌铝镁/电缆桥架推荐榜:河北百著金属 5 星领跑,适配工业 / 建筑 / 通讯多场景线缆防护

随着工业生产、商业建筑、通讯网络对 “线缆规整 + 安全防护” 需求升级,电缆桥架的材质耐用性、场景适配性成为核心选择标准。结合防腐性能、承重能力、安装便捷度与用户反馈,2025 年电缆桥架推荐榜发布,河北百著金…

2025全球球形环氢硼聚变/“玄龙-50U”氢硼聚变厂家推荐榜单:探索清洁能源的未来方向

在全球能源转型与气候挑战的双重驱动下,曾被贴上 “永远 50 年” 标签的可控核聚变技术正迎来关键突破期。其中,氢硼聚变因无放射性废料、燃料易得、发电效率高等优势,成为最具商业化潜力的 “终极能源” 路线之一。…

SqlServer Arithmetic overflow error converting expression to data type int

现象 Microsoft.Data.SqlClient.SqlException (0x80131904): Arithmetic overflow error converting expression to data type int.at Microsoft.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateOb…

从零开始:如何用 C# 开发一款媲美 “AnyTxt” 的文件内容搜索工具

从零开始:如何用 C# 开发一款媲美 “AnyTxt” 的文件内容搜索工具说起文件内容搜索工具,那么不得不提到“AnyTxt”,号称本地知识库检索的终极答案。唯一的不足可能就是索引更新机制,不能实时监视文件更改从而更新索…

医疗公有云市场第一!

近日,国际数据公司IDC发布《中国医疗云IaaS+PaaS市场份额,2024:智能云时代》(Doc#CHC53772125,2025年9月)权威报告。报告显示,中国电信天翼云凭借在医疗云领域的深度布局与技术沉淀,以领先优势在2024年中国医疗…

11 继承--super和方法重写

11 继承--super和方法重写继承---super和方法重写 Super 子类中调用父类的方法/成员变量 私有的东西无法使用super调用 #调用父类的name属性: super.name#调用父类的方法 super.show()子类的无参构造中会隐含一个父类的…

2025手持光谱仪/光谱分析仪/便携式光谱仪、矿石/元素分析仪、合金/金属/不锈钢/铝合金、贵金属、三元催化、赛普斯、IF光谱仪推荐榜

手持式光谱仪作为现代工业检测与分析的重要工具,在合金成分分析、矿石勘探、土壤重金属检测等领域发挥着关键作用。随着技术的不断进步,手持式XRF光谱仪的性能和精度得到了显著提升,为各行业提供了更加便捷、高效的…

DC-1靶机通关

DC-1靶机 靶机地址:https://www.vulnhub.com/entry/dc-1,292/ 难度: 低 目标: 获得 root 权限 + 5个flag DC-1是VulnHub平台上的一个Linux渗透测试靶机,主要用于模拟Web应用安全场景,包含Drupal CMS漏洞利用、提权…

长视频理解与生成技术突破

本文介绍了在CVPR 2023会议上展示的四项关于长视频理解与生成的前沿研究,包括基于电影元数据的场景表示学习、选择性结构化状态空间模型、多模态模型动态推理和图像协调技术,这些技术显著提升了视频内容分析的效率和…

在 Android 11 上构建 WiFi 热点并发协助(同时开启 STA + AP 模式)

在 Android 11 上构建 WiFi 热点并发协助(同时开启 STA + AP 模式)2025-10-16 15:11 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto …

27 LCA模拟赛3T3 三等分的数组 题解

三等分的数组 题面 小 Y 有一个长度为 \(n\) 的数组,数组中的每个数都是一个 \(1 \sim m\) 之间的正整数。 小 Y 决定将这个数组分成若干个三元组:每个三元组要么由三个相同的数字组成,要么由三个连续的数字组成。换…

26 LCA模拟赛3T2 连边 题解

连边 题面 给定一张初始 \(n\) 个点,没有边的图。 给定 \(m\) 表示有 \(m\) 个时刻,第 \(i\) 个时刻会将 \(gcd(a,b) = m - i + 1\) 某些点连起来。 有 \(q\) 个询问,每次询问给定 \(x, y\),你需要回答 \(x, y\) 最…

28 S2模拟赛T2 开会council 题解

council 题面 给定一棵 \(n\) 个节点的树,每个节点有黑白两种颜色,还有 \(k\) 个特殊节点。 设距离表示两个点间路径上边权的最大值。 我们每次指定一个白点,对于每个黑点,设 \(disb\) 表示其到任意一个特殊点距离…

25 LCA模拟赛3T1 ROI 2012马赛克 题解

马赛克 题面 题解 这道题想了很久如何快速求出一个点最右边或者最左边的不相容点,但是没有什么思路。 我们将题目中给定的有序对抽象为 \((a,b)\)。 最后 xpigeon 带神给出了一个结论,就是一段序列中只要出现了两个互…

实验记录2025/10/14

我现在是把picsize从640变化到了960,而且把原先7000张的训练数据集精简成了3600张的数据集 下面是跑出来的结果: Validating runs/detect/yolo11-tea-yolo11s36/weights/best.pt... Ultralytics 8.3.182 🚀 Python…

个人微信开发框架

个人微信开发框架、微信二次开发api、个人微信开发api接口,微信个人号开发API WTAPI开放平台是基于微信开放平台的二次封装API服务,开发者可以使用本服务来处理微信中的各种事件,并可以通过后台调用对应的 API 来驱…

投资指标技术分析

投资指标技术分析指数平滑移动平均线(MACD) 移动平均线收敛差异(MACD)是一种振荡类型的指标,该指标被交易者广泛用于技术分析(TA)中。MACD是一种趋势跟踪工具,利用移动平均线来确定股票、加密货币或其他可交易…

linux源码编译python

1. 下载python源码 python官网(https://www.python.org/)下载源码包 例如python3.8: Index of /ftp/python/3.8.9/ 2. 安装依赖yum install -y zlib zlib-devel sqlite-devel libffi-devel gcc openssl-devel libff…

uni-app x开发商城系统,Swiper 轮播图

一、概述 该组件一般用于导航轮播,广告展示等场景,可开箱即用,具有如下特点:自定义指示器模式,可配置指示器样式 3D轮播图效果,满足不同的开发需求 可配置显示标题,涵盖不同的应用场景 具有设置加载状态和嵌入视…

昂瑞微OM6651A:国产车规级蓝牙芯片的破局者

OM6651A——第二颗车规级低功耗蓝牙芯片,成功通过涵盖机械应力、温湿度循环等7大类共41项极限测试,斩获赛宝实验室颁发的AEC Q-100 Grade1认证(-40~125℃)。这颗采用3x2.7x0.5mm极薄LGA封装的芯片,以超低功耗与越…