128 哈希函数

原题网址:https://www.lintcode.com/problem/hash-function/description

描述

在数据结构中,哈希函数是用来将一个字符串(或任何其他类型)转化为小于哈希表大小且大于等于零的整数。一个好的哈希函数可以尽可能少地产生冲突。一种广泛使用的哈希函数算法是使用数值33,假设任何字符串都是基于33的一个大整数,比如:

hashcode("abcd") = (ascii(a) * 333 + ascii(b) * 332 + ascii(c) *33 + ascii(d)) % HASH_SIZE

= (97* 333 + 98 * 332 + 99 * 33 +100) % HASH_SIZE

= 3595978 % HASH_SIZE

其中HASH_SIZE表示哈希表的大小(可以假设一个哈希表就是一个索引0 ~ HASH_SIZE-1的数组)。

给出一个字符串作为key和一个哈希表的大小,返回这个字符串的哈希值。

您在真实的面试中是否遇到过这个题?  是

说明

For this problem, you are not necessary to design your own hash algorithm or consider any collision issue, you just need to implement the algorithm as described.

样例

对于key="abcd" 并且 size=100, 返回 78

标签

哈希表

思路:哈希函数的实现算法题目已经给出了,照着实现就好。这题考察的是类似大数阶乘的数据溢出问题,如果直接将字符串转成整数再求余,emmm……一般会溢出。所以在将字符串逐个字符转成整数的过程中就应该取余防止数据过大。

对于整数求模,(a * b) % m = a % m * b % m这个基本公式务必牢记。根据这个公式我们可以大大降低时间复杂度和规避溢出。 转载至此处

具体实现方式可以从高位(权值大的)到低位(权值小的)依次转化,也可以从低位到高位依次转化,后者需要额外定义一个权值,每次循环时*33,权值也同样需要取余。

AC代码(高位到低位):

class Solution {
public:
    /**
     * @param key: A string you should hash
     * @param HASH_SIZE: An integer
     * @return: An integer
     */
    int hashCode(string &key, int HASH_SIZE) {
        // write your code here
     int n=key.size();
     if (n==0)
     {
         return 0;
     }
     long result=key[0];//注意数据类型是long,防止数据过大造成溢出;
     for (int i=1;i<n;i++)
     {
         result=result*33+key[i];
         result=result%HASH_SIZE;//及时求余防溢出;
     }
     return result;
    }
};

低位到高位代码:

 int hashCode(string &key, int HASH_SIZE)
 {
     int n=key.size();
     if (n==0)
     {
         return 0;
     }
     long result=0;//注意数据类型;
     long hashBase=1;//权值,注意数据类型;
     for (int i=n-1;i>=0;i--)
     {
         result=result+key[i]*hashBase;
         result=result%HASH_SIZE;//及时求余防溢出;
         hashBase=hashBase*33%HASH_SIZE;//及时求余防溢出;
     }
     return result;
 }

参考:https://blog.csdn.net/nawuyao/article/details/50953557

https://www.cnblogs.com/libaoquan/p/7217165.html

https://www.jianshu.com/p/9a67268b5a94

https://blog.csdn.net/outmain/article/details/51233385

https://blog.csdn.net/ljlstart/article/details/48391799

原文地址:https://www.cnblogs.com/Tang-tangt/p/9140858.html

时间: 2024-07-28 12:23:56

128 哈希函数的相关文章

lintcode 128哈希函数

描述 在数据结构中,哈希函数是用来将一个字符串(或任何其他类型)转化为小于哈希表大小且大于等于零的整数.一个好的哈希函数可以尽可能少地产生冲突.一种广泛使用的哈希函数算法是使用数值33,假设任何字符串都是基于33的一个大整数,比如: hashcode("abcd") = (ascii(a) * 333 + ascii(b) * 332 + ascii(c) *33 + ascii(d)) % HASH_SIZE = (97* 333 + 98 * 332 + 99 * 33 +100)

哈希函数

1,直接地址法,线性函数值为哈希地址.2,数字分析法,关键字是以r为基的数,并且哈希表中可能出现的关键字是实现知道的,则可以取关键字的若干数位组成哈希表.3,平方取中法取关键字的平方后的中间几位为哈希地址.4,折叠法将关键字分割成位数相同的几个部分(最后一部分的位数可以不同),然后取这几部分的叠加和(舍去进位)作为哈希地址,这方法称为折叠法.关键字位数很多,而且关键字中每一位上数字分布大致均匀,可以采用折叠法得到哈希地址.移位叠加,间接叠加.5,除留余数法取关键字被某个不大于哈希表长m的数p除后

几种哈希函数的比较

基本概念所谓完美哈希函数,就是指没有冲突的哈希函数,即对任意的 key1 != key2 有h(key1) != h(key2).设定义域为X,值域为Y, n=|X|,m=|Y|,那么肯定有m>=n,如果对于不同的key1,key2属于X,有h(key1)!=h(key2),那么称h为完美哈希函数,当m=n时,h称为最小完美哈希函数(这个时候就是一一映射了). 在处理大规模字符串数据时,经常要为每个字符串分配一个整数ID.这就需要一个字符串的哈希函数.怎么样找到一个完美的字符串hash函数呢?有

哈希函数和哈希表综述 (转)

哈希表及哈希函数研究综述 摘要 随着信息化水平的不断提高,数据已经取代计算成为了信息计算的中心,对存储的需求不断提高信息量呈现爆炸式增长趋势,存储已经成为急需提高的瓶颈.哈希表作为海量信息存储的有效方式,本文详细介绍了哈希表的设计.冲突解决方案以及动态哈希表.另外针对哈希函数在相似性匹配.图片检索.分布式缓存和密码学等领域的应用做了简短得介绍 哈希经过这么多年的发展,出现了大量高性能的哈希函数和哈希表.本文通过介绍各种不同的哈希函数的设计原理以及不同的哈希表实现,旨在帮助读者在实际应用中,根据问

常用哈希函数的比较及其C语言实现

基本概念 所谓完美哈希函数,就是指没有冲突的哈希函数,即对任意的 key1 != key2 有h(key1) != h(key2). 设定义域为X,值域为Y, n=|X|,m=|Y|,那么肯定有m>=n,如果对于不同的key1,key2属于X,有h(key1)!=h(key2),那么称h为完美哈希函数,当m=n时,h称为最小完美哈希函数(这个时候就是一一映射了). 在处理大规模字符串数据时,经常要为每个字符串分配一个整数ID.这就需要一个字符串的哈希函数.怎么样找到一个完美的字符串hash函数呢

数据结构 - 哈希函数

哈希查找 之前的查找算法,时间复杂度为O(n),或者O(㏒2n),其效率取决于"比较"的次数. 即使对于采取排序树结构的查找表,由于每一次比较的结果,如果关键字与数据元素不相等,则有"大于"或者"小于"两个结果,所以下一步会有两种可能的方向,因此O(㏒2n)已经是最优了. 哈希表(Hash Table)采取另一种算法,其查找的时间复杂度最快可以达到O(1),即只要给出关键字,立刻就可以查找到该元素. 实际应用中大量采取哈希表的方式,很多编程语言中

算法6-1:哈希函数

在上章节中已经介绍了通过红黑树实现键值对数组的查询操作,复杂度是logN.有没有性能更好的算法呢?答案是有. 基本想法就是计算关键字的哈希值,再通过哈希值直接获取对应的键值. 这种方法的需要解决的问题是: 如何计算哈希值 如何解决哈系冲突 哈希函数 目标 根据对象中的成员变量的值,按照一定的规则计算出一个整数,这个整数就是哈希值. 哈希值最重要的两个属性是: 如果a.equals(b),那么a.hashCode() == b.hashCode() 理想状况下,如果!a.equals(b),那么a

哈希表之二哈希函数的构造

了解了hash的思想之后,会发现哈希函数只是将关键字对下标的映射,没有什么特别的标准,冲突的多少就是衡量其好坏. 若对于关键字集合中的任一一个关键字,经哈希函数映像到地址集合中任何一个地址的概率是相等的, 则称此类哈希函数为均匀的(Uniform)哈希函数. 如果关键字能够进过哈希函数计算得出的地址能够均匀地分布在地址区间中,就可以减少冲突. 直接定地址法 H(key)=key或H(key)=a*key+b 直接定址所得地址集合和关键字集合的大小相同,对于不同关键字不会发生冲突,但是实际使用较少

经常使用哈希函数的比較及其C语言实现

基本概念 所谓完美哈希函数.就是指没有冲突的哈希函数.即对随意的 key1 != key2 有h(key1) != h(key2). 设定义域为X,值域为Y, n=|X|,m=|Y|.那么肯定有m>=n,假设对于不同的key1,key2属于X,有h(key1)!=h(key2),那么称h为完美哈希函数,当m=n时,h称为最小完美哈希函数(这个时候就是一一映射了). 在处理大规模字符串数据时.常常要为每一个字符串分配一个整数ID.这就须要一个字符串的哈希函数.怎么样找到一个完美的字符串hash函数