Hash Tables 哈希表
来源:互联网 发布:java源码阅读工具 编辑:程序博客网 时间:2024/06/06 02:14
在了解哈希表之前我们先来看一下什么是Direct-Address tables?
假设我们的一个应用需要存储 键值对并且能支持操作 增删改查那么我们首先最原始的方法就是使用 Direct-address table. 我们在 T 中通过对键的查找直接找到相对应的数据。
这种方法看似很好,但是有很大的局限性。 首先我们需要确定Universe of keys (U), 所以当U集合很大时, 会造成效率低下等问题。这时候一种更好的方法 Hash table 应运而生。
Hash table 就是一种将key通过 hash 函数进行计算之后,存储到key的hash code相对应的bucket中。值得注意的是bucket中存储的不仅仅是 value(值) 同时也存储 key (键)!!!如下图
这样做会有什么问题?
当对不同的key进行hash的时候,可能造成一种错误,collision (碰撞) - 不同的键在hash之后变成相同的hash code.
如何避免碰撞?
有两种方法.
1. Chaining
在hash table中, 我们采用一个额外的链表对 key-value进行存储( 上文中提到了bucket中存储的不仅仅是value还有key), 从下图可以看出,当Jack 和 Andrew 同时被分配到了同一个bucket 中时候,可以再继续对bucket中的链表进行遍历,找到key对应的是value就可以。hash table中存储的是链表的表头
2. Open Addressing
与chaining采用而外的链表来存储key-value不同的是,open addressing直接将所有的key-value存储到bucket中,过程是这样的: 对 Jack Williams进行hash然后再bucket中找到相对应的位置,并且该位置为空,那么我们就把key-value存储下来, Sam Taylor, Sandra Miller Mattew Davis 都是这样,但是现在来了Andrew Wilson,它的hash code和Jack Williams 是一样的, 那么我们就在离它原本最近的bucket中找到一个空的位置赋值给他。 当查询Andrew时,我们首先查询到的是Jack, 发现andrew不在这,那我们就进行向下走直到找到Andrew. hash table中存储的是实际的key-value
有问题欢迎指出!
- Hash Tables 哈希表
- Glib学习(4) 哈希表 Hash Tables
- Hash Tables: Distributed Hash Tables--Data Structure
- Distributed Hash Tables
- EPI: hash tables
- 1.2.2. Caching and Hash Tables 高速缓存和哈希表
- 《Thinking In Algorithm》05.Hash Tables(哈希表)
- 数据结构分析之线性哈希表(Linear Hash Tables)
- Distributed Hash Tables, Part I
- Five Myths about Hash Tables
- Javascript: hash tables in javascript
- Javascript: hash tables in javascript
- HackerRank-Hash Tables: Ransom Note
- 区分几个概念:Dictionary, Direct-address Tables, Hash Tables
- How to define hash tables in bash?
- The Difference Between Trees and Hash Tables
- Theory Of Hashing And Hash Tables
- Hash Tables: String Search--Data Structure
- [Java1.8]_[Stream]
- 二叉树查找
- AJAX进阶应用
- ubuntu设置环境变量
- NYOJ 290动物统计加强版(Trie树)
- Hash Tables 哈希表
- POJ4001/HDU4121 Xiangqi 大模拟
- Android 网络框架_网络框架的核心Http协议
- matlab 中画箭头
- MySQL日志管理
- Android 自定义View 圆环交替 等待效果
- Mongo使用命令
- python json.dumps 中文编码
- 非常详细的 Docker 学习笔记