数据结构-3-[哈希表]

128 阅读3分钟

这是我参与8月更文挑战的第8天,活动详情查看:8月更文挑战

1. 概述:

  • 哈希表也叫散列表(英文是Hash Table)是一种以 键-值(key-value) 存储数据的结构
  • 它通过计算一个关于键值的函数,根据key所需查询的数据value映射到表中一个位置来访问记录,这加快了查找速度。
    • 这个映射函数称做散列函数
    • 存放记录的数组称做散列表

1.1 哈希碰撞

1.2 哈希碰撞解决方法

  • 1.2.1 开放地址法 如果遇到哈希冲突,找hash表剩下空余的空间,找到空余的空间然后插入。即哈希表中对应哈希值已有元素,就对应下一个元素(前面或后面均可)。 image.png
  • 1.2.2 拉链法(常用) 如果遇到哈希冲突,则就会在原地址新建一个空间,然后以链表结点的形式插入到该空间。
    image.png

1.2 哈希表的性能

  • 由于哈希表高效的特性:查找或者插入的情况在大多数情况下可以达到O(1),时间主要花在计算hash上,当然也有最坏的情况就是hash值全都映射到同一个地址上,这样哈希表就会退化成链表,查找的时间复杂度变成O(n)
  • 时间复杂度: O(1)~O(n) image.png

2. GeekTime

  • 2.1 HashTable/HashFunction/Collisions(冲突)

  • 2.2 List/Map/Set

  • 2.3 HashMap/HashSet/TreeMap/TreeSet

  • 【hash】-> HashMap | HashSet

    • 实现方式:hashtable (哈希表)
    • 时间复杂度 O(1)
  • 【tree】-> TreeMap | TreeSet

    • 实现方式:binary-search-tree (二叉树)
    • 时间复杂度 O(logN)

3. 常见结构(java)

3.1 HashMap

3.1.1 介绍

  • 基于哈希表的 Map 接口的实现,允许key和value均为 null
  • 基于数组和链表结合组成的复合结构
    • 数组被分为一个个桶(bucket),
    • 每个桶存储有一个或多个Entry对象(每个Entry对象包含三部分key、value,next)

3.1.2 构造方法

  • 默认初始容量 (16) 和默认加载因子 (0.75)
 HashMap():默认容量(16)和加载因子(0.75)
 HashMap(int initialCapacity):指定初始容量和默认加载因子(0.75) 
 HashMap(int initialCapacity, float loadFactor):指定初始容量、指定加载因子的空 
 HashMap(Map<? extends K,? extends V> m):构造一个映射关系与指定 Map 相同的 HashMap

3.1.3 常用方法

V put(K key, V value): 在此映射中关联指定值与指定键。
V get(Object key):返回指定键在此标识哈希映射中所映射的值,不存在则返回 nullboolean containsKey(Object key):如果此映射包含对于指定的键的映射关系,则返回 trueboolean containsValue(Object value): 如果此映射将一个或多个键映射到指定值,则返回 true。

Set<Map.Entry<K,V>> entrySet():返回此映射所包含的映射关系的 collection 视图。 

Set keySet():返回此映射中所包含的键的set 视图。
Collection values():返回此映射所包含的值的collection 视图。

V remove(Object key): 如果此映射中存在该键的映射关系,则将其删除。
void clear():从此映射中移除所有映射关系。

int size():返回此映射中的键-值映射关系数。
boolean isEmpty():如果此映射不包含键-值映射关系,则返回 true

3.2 HashTable

参考地址