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

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

哈希表(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.hskmm.com/?act=detail&tid=32363

相关文章:

  • 2025 防火/模压/瓦楞/大跨距/热镀锌/热浸锌/不锈钢/光伏/铝合金/锌铝镁/电缆桥架推荐榜:河北百著金属 5 星领跑,适配工业 / 建筑 / 通讯多场景线缆防护
  • 2025全球球形环氢硼聚变/“玄龙-50U”氢硼聚变厂家推荐榜单:探索清洁能源的未来方向
  • SqlServer Arithmetic overflow error converting expression to data type int
  • 医疗公有云市场第一!
  • 2025手持光谱仪/光谱分析仪/便携式光谱仪、矿石/元素分析仪、合金/金属/不锈钢/铝合金、贵金属、三元催化、赛普斯、IF光谱仪推荐榜
  • DC-1靶机通关
  • CSS复习
  • 长视频理解与生成技术突破
  • 27 LCA模拟赛3T3 三等分的数组 题解
  • 26 LCA模拟赛3T2 连边 题解
  • 28 S2模拟赛T2 开会council 题解
  • 25 LCA模拟赛3T1 ROI 2012马赛克 题解
  • 实验记录2025/10/14
  • 个人微信开发框架
  • 投资指标技术分析
  • linux源码编译python
  • uni-app x开发商城系统,Swiper 轮播图
  • 昂瑞微OM6651A:国产车规级蓝牙芯片的破局者
  • 2025年中央空调/锅炉房/机房运维服务厂家最新权威推荐榜:专业托管与维修外包一体化解决方案精选
  • 【终极解决方案】api-ms-win-core-path-l1-1-0.dll 缺失?Win7/Win10/Win11完整修复教程
  • 2025 年最新推荐分切机实力厂家权威榜单:覆盖全自动高速、铝箔、薄膜、高精度等机型,为软包装企业精选优质设备
  • 打破应用跳转流失困局,提升推广链接转化率
  • 性能测试进阶秘籍:如何用JMeter分布式压测挖掘系统极限潜
  • Codeforces Round 1058 (Div. 2) A~E
  • 2025 年生料带厂家最新推荐排行榜:解析优质品牌优势,涵盖新型、彩色、液态等多类型生料带厂家企业推荐
  • openresty开发lua-resty-openssl之对称加密解密 - liuxm
  • 哈希乱搞:CF1418G Three Occurrences
  • 2025 年废旧轮胎裂解加热生产厂家最新推荐榜单:优质企业专利技术、产能规模与口碑实力全景解析锂化工焚烧炉/氟化热风系统/煤化工热风炉厂家推荐
  • 悲伤 自卑 乖戾 独自哭泣 陪伴空虚 kill my memory 让我将痛苦全忘记
  • 日志 | 2025.10