基础算法(九) --- 哈希与哈希表

来源:互联网 发布:网络分销策略 编辑:程序博客网 时间:2024/05/02 01:12
        哈希是可以达到快速存取的一种算法。俺接触到的利用哈希的地方基本都是通过关键字进行查询的,而且关键字都是比较复杂,比如说字符串,根据关键字比较非常繁琐耗时。这样的情况下,哈希就非常有作用了。
       它的存放过程是怎样的呢?首先,通过哈希函数将复杂的关键字计算出一个哈希表元素的索引;然后将真正的关键字的实际位置信息,作为索引位置对应的元素值。如果存在冲突,就继续找下一个合适的位置存放。下一个合适的位置是怎么找的呢,实际上很多解决冲突的办法。比较常见的有两个方式,一个是将当前的索引值向前推进找到空余地址为止;另外一个是采用链表,哈希表元素实际上是个链表的头节点,跟它相同哈希值的节点,都挂在它的后面。
       那么查询过程又是怎样的呢?首先,根据关键字利用哈希函数得到哈希表的元素位置,然后获取到一个关键字的实际信息,比较两个关键字是否一样,如果命中则成功,否则根据解决冲突的方式查找下一个关键字的实际信息并进行比较,直到找到或者到了哈希表的尽头。
       哈希表的性能跟哈希表的大小以及哈希函数有关,网上有很多哈希函数的介绍,这里就不多啰嗦了,有兴趣可以直接问百度。
       Example 1:
       简单的校验码。网络传输数据的时候,数据可能会被篡改。为了安全起见,网络应用传输的数据如果很重要的话,发送方会根据一个哈希算法计算出校验码,并传递给接收方。接收方在接收到数据之后,利用相同的算法计算出哈希值,并跟接收到的校验码进行比较是否是正确的数据。
       Example 2:
       HTML解析引擎的元素ID获取实现。HTML的元素名基本已经很明确了,就是W3C定义的那些。在解析HTML文本数据的时候,直接比较元素名称而获取元素ID的话,则显得比较浪费。那么可以将元素名与元素ID作为一个结构保存到数组里,并根据元素名作为关键字生成一个哈希表。这样在解析到一个元素名而要去获取元素ID的时候,可以先用哈希函数快速定位到当前元素名的位置信息,从而也就获取到元素ID了。
原创粉丝点击