Hash表
文章平均质量分 78
wangpengqi
这个作者很懒,什么都没留下…
展开
-
(8)Linux内核中的hash与bucket
哈希表哈希表(Hashtable)又称为“散列”,Hashtable是会根据索引键的哈希程序代码组织成的索引键(Key)和值(Value)配对的集合。Hashtable 对象是由包含集合中元素的哈希桶(Bucket)所组成的。而Bucket是Hashtable内元素的虚拟子群组,可以让大部分集合中的搜寻和获取工作更容易、更快速。 哈希函数(Hash Function)为根据索引键转载 2013-08-02 13:10:28 · 1129 阅读 · 0 评论 -
(2)散列表是怎么进行查找的
散列过程整个散列过程其实就是两步。1. 在存储的时候,通过散列函数计算记录的散列地址,并按此散列地址存储该记录。就像张三丰我们就让他在体育馆,那如果是“爱因斯坦”我们让他在图书馆,如果是“居里夫人”,那就让她在化学实验室。如果是“巴顿将军”,这个打即时战略游戏的高手,我们可以让他到网吧。总之,不管什么记录,我们都需要用同一个散列函数计算出地址再存储。2. 当转载 2013-08-02 11:02:54 · 1189 阅读 · 0 评论 -
(7)哈希表的链地址法实现
哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。哈希表在像Java、C#等语言中是与生俱来的。可是在C的世界中,似乎只有自己动手,丰衣足食了。哈希表实现中需要注意的问题。1. 哈希函数也叫散列函数,即:根据key,计算出key对应记录的储存位置转载 2013-08-02 11:44:52 · 2389 阅读 · 0 评论 -
(9)引入哈希桶的概念来实现一个哈希表
前面的讲述了如何用链地址法实现一个哈希表,那么今天来分析一下另一种解决哈希冲突的做法,即为每个Hash值,建立一个Hash桶(Bucket),桶的容量是固定的,也就是只能处理固定次数的冲突,如1048576个Hash桶,每个桶中有4个表项(Entry),总计4M个表项。其实这两种的实现思路雷同,就是对Hash表中每个Hash值建立一个冲突表,即将冲突的几个记录以表的形式存储在其中。大致的思转载 2013-08-02 14:12:20 · 4161 阅读 · 0 评论 -
(10)魔兽文件打包器里的传奇哈希表
关于哈希表C实现,前面两个小节已分别介绍了不同的方法,不过似乎网上流传最具传奇色彩的莫过于暴雪公司的魔兽文件打包管理器里的hashTable的实现了;在冲突方面的处理方面,采用线性探测再散列。在添加和查找过程中进行了三次哈希,第一个哈希值用来查找,后两个哈希值用来校验,这样可以大大减少冲突的几率。在网上找了相关代码,但不知道其来源是否地道:StringHash.h#incl转载 2013-08-02 14:31:02 · 1476 阅读 · 0 评论 -
(11)DJBX33A APR哈希默认算法
这是很出名的times33哈希算法,此算法被perl语言采用并在Berkeley DB中出现。它是已知的最好的哈希算法之一,在处理以字符串为键值的哈希时,有着极快的计算效率和很好哈希分布。最早提出这个算法的是Dan Bernstein,但是源代码确实由Clris Torek在Berkeley DB出实作的。我找到的最确切的引文中这样说:“Chris Torek,C语言文本哈转载 2013-08-02 14:50:56 · 910 阅读 · 0 评论 -
Times33算法与最快的Hash表
关于times33算法不约而同的,几乎所有的流行的hash map都采用了DJB hash function,俗称“Times33”算法。Perl、Berkeley DB 、Apache、MFC、STL 等等。times33的算法也很简单,就是不断的乘33。nHash = nHash*33 + *key++;我没找到什么理论可以说明这种算法的合理性,据说只是通过测试和实践发转载 2013-08-02 14:58:02 · 2059 阅读 · 0 评论 -
Linux内核哈希表分析与应用
前言:1.基本概念:散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。2. 常用的构造散列函数的方法散列函数能使对一个数据序列的访问过程更加迅速有效,通过散列函数,数据元素将被更快地定位。散列表的常转载 2013-08-02 18:54:54 · 1017 阅读 · 0 评论 -
(4)散列函数设计:除留余数法
除留余数法介绍除留余数法此方法为最常用的构造散列函数方法。对于散列表长为m的散列函数公式为:f( key ) = key mod p ( p ≤ m )mod是取模(求余数)的意思。事实上,这方法不仅可以对关键字直接取模,也可在折叠、平方取中后再取模。一个例子很显然,本方法的关键就在于选择合适的p, p如果选得不好,就可能会容易产生同转载 2013-08-02 11:10:47 · 11525 阅读 · 1 评论 -
(5)散列冲突处理:开放定址法
前面我们讲了一些设计散列函数的方法,从前面的除留余数法的例子也可以看出,我们设计得再好的散列函数也不可能完全避免冲突,这就像我们再健康也只能尽量预防疾病,但却无法保证永远不得病一样,既然冲突不能避免,就要考虑如何处理它。那么当我们在使用散列函数后发现两个关键字key1≠key2,但是却有f(key1) = f(key2),即有冲突时,怎么办呢?我们可以从生活中找寻思路。转载 2013-08-02 11:26:04 · 1725 阅读 · 0 评论 -
各种字符串Hash函数
整理了一下几个字符串hash函数,使用了模板,使其支持宽字符串,代码如下:/// @brief BKDR Hash Function/// @detail 本算法由于在Brian Kernighan与Dennis Ritchie的《The C Programming Language》一书被展示而得名,是一种简单快捷的hash算法,也是Java目前采用的字符串的Hash算法(累乘因子为31)转载 2013-07-31 19:08:03 · 651 阅读 · 0 评论 -
从头到尾彻底解析Hash表算法
第一部分为一道百度面试题Top K算法的详解;第二部分为关于Hash表算法的详细阐述;第三部分为打造一个最快的Hash表算法。------------------------------------ 第一部分:Top K 算法详解问题描述百度面试题: 搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。转载 2013-07-31 19:10:28 · 638 阅读 · 0 评论 -
Hash魔法:分布式哈希算法
我们从浅入深一步一步介绍什么是分布式哈希表。哈希函数哈希函数是一种计算方法,它可以把一个值A映射到一个特定的范围[begin, end]之内。对于一个值的集合{k1, k2, … , kN},哈希函数把他们均匀的映射到某个范围之中。这样,通过这些值就可以很快的找到与之对应的映射地址{index1, index2, … , indexN}。对于同一个值,哈希函数要能保证对这个值的运算转载 2013-07-31 19:21:52 · 1650 阅读 · 0 评论 -
Hash魔法:一致性 hash 算法
consistent hashing 一致性 hash 算法早在 1997 年就在论文 Consistent hashing and random trees 中被提出,目前在 cache 系统中应用越来越广泛。基本场景比如你有 N 个 cache 服务器(后面简称 cache ),那么如何将一个对象 object 映射到 N 个 cache 上呢,你很可能会采用类似下面的通用方法转载 2013-07-31 19:22:51 · 591 阅读 · 0 评论 -
字符串的经典hash算法
1 概述 链表查找的时间效率为O(N),二分法为log2N,B+ Tree为log2N,但Hash链表查找的时间效率为O(1)。 设计高效算法往往需要使用Hash链表,常数级的查找速度是任何别的算法无法比拟的,Hash链表的构造和冲突的不同实现方法对效率当然有一定的影响,然而Hash函数是Hash链表最核心的部分,本文尝试分析一些经典软件中使用到的字符串Hash函数在执行效率、转载 2013-07-31 19:27:07 · 642 阅读 · 0 评论 -
(6)散列冲突处理:链地址法
链地址法(拉链法)前面我们谈到了散列冲突处理的开放定址法,它的思路就是一旦发生了冲突,就去寻找下一个空的散列地址。那么,有冲突就非要换地方呢,我们直接就在原地处理行不行呢?可以的,于是我们就有了链地址法。将所有关键字为同义词的记录存储在一个单链表中,我们称这种表为同义词子表,在散列表中只存储所有同义词子表的头指针。对于关键字集合{12,67,56,16,25,37,转载 2013-08-02 11:40:29 · 2257 阅读 · 0 评论 -
(1)散列表(哈希表)的定义
一般的查找给你一个顺序表,你会如何查找某个给定的元素?一般思路就是从表头开始,一个挨一个的比较记录a[i]与key的值是“=”还是“≠”,直到有相等才算是査找成功,返回i的值。到了有序表(已排序的表)査找时,我们可以利用a[i]与key的“”,来折半査找,直到相等时査找成功返回i。反正我们的目标就是要找到那个 i 值,是不是还有其它好点的方法呢?转载 2013-08-02 11:01:29 · 970 阅读 · 0 评论 -
(3)散列函数设计:直接定址法
上一篇说到了,设计一个简单、均匀、存储利用率高的散列函数是散列技术中最关键的问题。那么我们今天开始就看看,如何去设计散列函数。散列函数的设计原则不管做什么事情,要做到最优都不容易,既要付出尽可能的少,又要得到最大化的多。那么什么才算是好的散列函数呢?这里我们有两个原则可以参考。1. 计算简单你说设计一个算法可以保证所有的关键字都不会产生冲突,但是转载 2013-08-02 11:05:50 · 4868 阅读 · 1 评论 -
(13)拨云见日,闲聊哈希表
经典数据结构教科书中,“表”是数据结构的一个大家族。其中,有顺序表(数组)、单向链表、双向链表、循环链表等等。我们今天聊的不是这些,而是“表”中的异类——哈希表(Hash Table)。为啥需要哈希表为什么会有哈希表这种数据结构呢?让我们用一个通俗的例子来理解:大家一定都查过字典吧,我们知道,《新华字典》是按照读音排序的,可以理解为一个以读音为key,按升序排列的数据库转载 2013-08-02 14:59:55 · 1152 阅读 · 0 评论