update hash
This commit is contained in:
+25
-17
@@ -1,6 +1,4 @@
|
||||
|
||||
|
||||
## 散列表
|
||||
# 散列表
|
||||
|
||||
本节围绕以下内容展开:
|
||||
|
||||
@@ -16,7 +14,18 @@
|
||||
散列表是算法在时间和空间上做出权衡的经典例子。通过一个散列函数,将键值key映射到记录的访问地址,达到快速查找的目的。如果没有内存限制,我们可以直接将键作为数组的索引,所有的操作操作只需要一次访问内存就可以完成。但这种情况不太现实。
|
||||
|
||||
|
||||
### 散列函数
|
||||
|
||||
## Hashmap应用
|
||||
|
||||
1. cocos2d 游戏引擎 CCScheduler
|
||||
2. linux 内核bcache。 缓存加速技术,使用SSD固态硬盘作为高速缓存,提高慢速存储设备HDD机械硬盘的性能
|
||||
3. hash表在海量数据处理中有广泛应用。如海量日志中,提取出某日访问百度次数最多的IP
|
||||
4. Java 中HashMap实现。编程语言中HashMap是如何实现的呢? 说说 Java , Golang
|
||||
5. redis hash结构, set通常也是基于Hash结构实现
|
||||
|
||||
|
||||
|
||||
## 散列函数
|
||||
|
||||
散列函数就是将键转化为数组索引的过程。且这个函数应该易于计算且能够均与分布所有的键。
|
||||
|
||||
@@ -50,7 +59,12 @@ Hash hashCode(char *key){
|
||||
当然,还有其他的散列函数,如`平方取中法`, `随机数法`等。
|
||||
|
||||
|
||||
### 碰撞解决
|
||||
## 碰撞解决
|
||||
|
||||
** 负载因子(load factor)**
|
||||
|
||||
hash 表有一个特性, 随着元素越来越多, 新插入一个元素发生hash冲突的次数就会越来越多, 查找一个元素的速度也会越来越慢。
|
||||
|
||||
|
||||
不同的关键字得到同一个散列地址` f(key1)=f(key2) `,即为碰撞 。这是我们需要尽量避免的情况。常见的处理方法有:
|
||||
|
||||
@@ -58,7 +72,7 @@ Hash hashCode(char *key){
|
||||
2. 线性探测法
|
||||
|
||||
|
||||
#### 拉链法
|
||||
### 拉链法
|
||||
|
||||
将大小为M的数组中的每个元素指向一条链表,链表中的每个节点都存储了散列值为该元素索引的键值对。每条链表的平均长度是N/M,N是键值对的总个数。如下图:
|
||||
|
||||
@@ -79,12 +93,12 @@ Hash hashCode(char *key){
|
||||
3. 遍历链表,删除结点
|
||||
|
||||
|
||||
#### 线性探测法
|
||||
### 线性探测法
|
||||
|
||||
使用大小为M的数组保存N个键值对,当碰撞发生时,直接检查散列表中的下一个位置。
|
||||
|
||||
|
||||
### 数据结构和算法
|
||||
## 数据结构和算法
|
||||
|
||||
这里给出拉链法构造的hashmap的算法,表示如下:
|
||||
|
||||
@@ -198,17 +212,11 @@ HashMap *_putInList(HashMap *hashMap,int index,Key key,Value value){
|
||||
```
|
||||
|
||||
|
||||
### Hashmap应用
|
||||
### 扩容
|
||||
|
||||
1. cocos2d 游戏引擎 CCScheduler
|
||||
2. linux 内核bcache。 缓存加速技术,使用SSD固态硬盘作为高速缓存,提高慢速存储设备HDD机械硬盘的性能
|
||||
3. hash表在海量数据处理中有广泛应用。如海量日志中,提取出某日访问百度次数最多的IP
|
||||
|
||||
|
||||
## Java 中HashMap实现
|
||||
|
||||
编程语言中HashMap是如何实现的呢? 说说 Java , Golang
|
||||
当hash表保存的键值对数量太多或太少,对hash 表进行扩容和缩容。合理控制内存的使用。
|
||||
|
||||
redis hash中, rehash发生在扩容或缩容阶段,扩容是发生在元素的个数等于哈希表数组的长度时,进行2倍的扩容;缩容发生在当元素个数为数组长度的10%时,进行缩容
|
||||
|
||||
|
||||
## 参考
|
||||
|
||||
Reference in New Issue
Block a user