Skip to content

Commit

Permalink
update hashmap
Browse files Browse the repository at this point in the history
  • Loading branch information
冉文杰 committed Mar 11, 2016
1 parent b7f11d0 commit 652a947
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 5 deletions.
30 changes: 25 additions & 5 deletions 哈希表/README.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,18 @@


## 散列表

本节围绕以下内容展开:

* 散列表
* 散列函数设计
* 冲突处理
* hashmap数据结构


散列表使用某种算法操作(散列函数)将键转化为数组的索引来访问数组中的数据,这样可以通过Key-value的方式来访问数据,达到常数级别的存取效率。现在的nosql数据库都是采用key-value的方式来访问存储数据。

散列表是算法在时间和空间上做出权衡的经典例子。如果没有内存限制,我们可以直接将键作为数组的索引,所有的操作操作只需要一次访问内存就可以完成。但这种情况不太现实。
散列表是算法在时间和空间上做出权衡的经典例子。通过一个散列函数,将键值key映射到记录的访问地址,达到快速查找的目的。如果没有内存限制,我们可以直接将键作为数组的索引,所有的操作操作只需要一次访问内存就可以完成。但这种情况不太现实。


### 散列函数
Expand Down Expand Up @@ -39,26 +48,31 @@ Hash hashCode(char *key){

当然,还有其他的散列函数,如`平方取中法`, `随机数法`等。


### 碰撞解决

散列函数另外一个要处理的问题就是碰撞问题,也就是多个键的散列值相同的情况。常见的处理方法有:
不同的关键字得到同一个散列地址` f(key1)=f(key2) `,即为碰撞 。这是我们需要尽量避免的情况。常见的处理方法有:

1. 拉链法
2. 线性探测法


#### 拉链法

将大小为M的数组中的每个元素指向一条链表,链表中的每个节点都存储了散列值为该元素索引的键值对。每条链表的平均长度是N/M,N是键值对的总个数。
将大小为M的数组中的每个元素指向一条链表,链表中的每个节点都存储了散列值为该元素索引的键值对。每条链表的平均长度是N/M,N是键值对的总个数。如下图:

!()[./hashmap]

添加操作:

添加操作:
1. 通过hash函数得到hashCode
2. 通过hashcode得到index
3. 如果index处没有链表,建立好新结点,作为新链表的首结点
4. 如果index处已经有链表,先要遍历看key是否已经存在,如果存在直接返回,如果不存在,加入链表头部


删除操作:
删除操作:

1. 通过hash函数得到hashCode
2. 通过hashcode得到index
3. 遍历链表,删除结点
Expand Down Expand Up @@ -183,6 +197,12 @@ HashMap *_putInList(HashMap *hashMap,int index,Key key,Value value){
```


### Hashmap应用

1. cocos2d 游戏引擎 CCScheduler
2. linux 内核bcache。 缓存加速技术,使用SSD固态硬盘作为高速缓存,提高慢速存储设备HDD机械硬盘的性能
3. hash表在海量数据处理中有广泛应用。如海量日志中,提取出某日访问百度次数最多的IP


## 参考

Expand Down
Binary file added 哈希表/hashmap.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 652a947

Please sign in to comment.