FAIRYFAR-INTERNAL
 
  FAIRYFAR-INTERNAL  |  SITEMAP  |  ABOUT-ME  |  HOME  
您的足迹: Hash算法概述
Hash算法概述

哈希函数(hash function)

哈希表是一种通过 keys 对 value 的映射,来实现数据访问的数据结构,而这种映射一般分为两个阶段:

  • 将关键字 key 作为自变量, 通过一定的函数关系,计算出的因变量作为 value 的索引(index)。
  • 如果该索引指向的空间上没有存储数据,则将 value 插入,否则,称为产生了一个冲突(collision),需要对冲突进行处理,之后找到新的没有数据的空间,再将 value 插入。

冲突处理(collision resolution)

当key的集合很大的时候,根据生日问题(birthday problem)原理,哈希冲突实际上是不可避免的,所以几乎所有的哈希表都会有对于冲突的解决策略,主要方法:

  1. 拉链法(separate chaining):也被称为开放散列法(open hashing)或封闭定址法(closed addressing)
  2. 开放定址法(open addressing),也被称为封闭散列(closed hashing)
  3. 建立公共溢出区(building a public overflow area)
  4. 其他方法: * 联合哈希法(coalesced hashing) * 疯狂哈希法(cuckoo hashing) * 跳房子哈希法(hopscotch hashing) * 罗宾汉哈希法(robin hood hashing) * 二选哈希法(2-choice hashing)

负载因子(load factor)

一个评估哈希表的关键统计数据,被定义为:load factor = n / k, n 是记录的数量,k 是桶的数量

  • 随着负载因子的扩大,出现冲突的概率会越来越大,所以当超过一定阈值时,需要扩容,避免哈希表因为频繁处理冲突而越来越慢。
  • 随着负载因子的缩小,桶数组中空着的槽就越来越多,所以当小过一定阈值时,需要缩容,避免空槽飙升导致的内存浪费。

参考



打赏作者以资鼓励: