赞
踩
Hash(哈希),又称“散列”。
通常我们使用数组或者链表来存储元素,查找通过对比进行,但是当数量大时比较次数太多,复杂度太大。
而通过哈希计算,可以大大减少比较次数。
比如现在有5个元素{1,15,2,55,94,}
现在要查找94是不是在其中,如果数组或者链表就是挨个进行比较。
hash方法:
首先确定一个hash函数,f(x) = x % 5;
f(1) = 1%5 = 1
f(2) = 2%5 = 2
f(15) = 15%5 = 0
f(55) = 55%5 = 0
f(94) = 94%5 = 4
现在找95是不是在其中,只有通过hash函数计算一下hash值然后在hash表中查找即可:
hash表
key <--> value
1 <--> 1
2 <--> 2
0 <--> 15
0 <--> 55
4 <--> 94
hash函数:记录的关键字和存储位置建立映射关系
对应关系f()称为散列函数,或者哈希函数
如举例子中的 f(x) = x % 5;
哈希函数是一种映射关系
通过hash计算并存储对应关系的表叫做hash表。
如上面例子中的hash表
key <--> value
1 <--> 1
2 <--> 2
0 <--> 15
0 <--> 55
4 <--> 94
就是通过hash函数计算的时候,不同的key值,相同的value。
如例子中通过hash函数:f(x) = x % 5计算15 55时,value都为0
f(15) = 15%5 = 0
f(55) = 55%5 = 0
这就是hash冲突。
哈希表(hash table)是哈希函数最主要的应用。
用哈希函数计算关键字的哈希值(hash value),通过哈希值这个索引就可以找到关键字的存储位置,即桶(bucket)。
哈希表不同于二叉树、栈、序列的数据结构一般情况下,在哈希表上的插入、查找、删除等操作的时间复杂度是 O(1)。
http://www.nowamagic.net/librarys/veda/detail/1273
https://blog.csdn.net/u012835097/article/details/79407591
哈希桶就是为了解决哈希冲突
哈希桶算法其实就是链地址解决冲突的方法
哈希桶一般数据结构如下:
typedef struct tagHASH_BUCKET
{
int iHashBucketSize; //哈希桶大小 如 1024
int (*pfHash)(const void *); //哈希计算函数 如简单的 y = 3x +1 (key=1时,value = 4 value就是索引)
SinList *pstBucket; //哈希桶中每个桶的单链表
}
如下图所示:
有哈希桶,桶大小1024,每个桶都是一个链表来存储数据。
桶1,链表中有三个节点,分别存储了 a,b,c
桶2,链表中有一个节点,存储了数据 f
桶1024,链表中有一个节点,存储了数据 q
如上如所示,
哈希桶大小是:1024
哈希计算函数:y = 3x +1 (key=0时,value = 1)
哈希桶中每个桶的单链表
现在需要将 (key,value) 0,k
对key=0计算haxi y=3x+1 =1 即:索引时1的桶
那么就在桶1的链表后面加一个节点,节点值为k
https://www.cnblogs.com/xqn2017/p/7997666.html
https://blog.csdn.net/tanggao1314/article/details/51457585
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。