lintcode 容易题:Hash Function 哈希函数

题目:

哈希函数

在数据结构中,哈希函数是用来将一个字符串(或任何其他类型)转化为小于哈希表大小且大于等于零的整数。一个好的哈希函数可以尽可能少地产生冲突。一种广泛使用的哈希函数算法是使用数值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和一个哈希表的大小,返回这个字符串的哈希值。

 样例

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

解题:

其实很简单,上面给的公式实现就好了,但是这里可能出现,内存溢出和运行超时的情况,所以设置long,下面的Java程序中 hashcode 和base都设置成long才不会有问题,还有个就是每步结果最后%HASH_SIZE放在溢出

Java程序:

class Solution {
    /**
     * @param key: A String you should hash
     * @param HASH_SIZE: An integer
     * @return an integer
     */
    public int hashCode(char[] key,int HASH_SIZE) {
        // write your code here
        int len = key.length;
        long hashcode = 0;
        long base = 1;
        for(int i=len-1;i>=0;i--){
            hashcode = hashcode  + Integer.valueOf(key[i])*base % HASH_SIZE;
            hashcode = hashcode%HASH_SIZE;
            base = base *33% HASH_SIZE;
        }
        return (int)hashcode;
    }
};

总耗时: 2020 ms

Python程序:

class Solution:
    """
    @param key: A String you should hash
    @param HASH_SIZE: An integer
    @return an integer
    """
    def hashCode(self, key, HASH_SIZE):
        # write your code here
        hashcode = 0
        keylen = len(key)
        key10 =  map(ord,key)
        base = 1
        for i in range(keylen):
            hashcode += key10[keylen-i-1]*base%HASH_SIZE
            base = base * 33%HASH_SIZE
        return hashcode%HASH_SIZE

总耗时: 245 ms

上面Python程序中,里面map将字符串映射到ascii形式,再求指数的时候直接计算可能会运行超时

时间: 2024-08-25 19:18:08

lintcode 容易题:Hash Function 哈希函数的相关文章

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)

Lintcode: Hash Function && Summary: Modular Multiplication, Addition, Power && Summary: 长整形long

In data structure Hash, hash function is used to convert a string(or any other type) into an integer smaller than hash size and bigger or equal to zero. The objective of designing a hash function is to "hash" the key as unreasonable as possible.

128 哈希函数

原题网址:https://www.lintcode.com/problem/hash-function/description 描述 在数据结构中,哈希函数是用来将一个字符串(或任何其他类型)转化为小于哈希表大小且大于等于零的整数.一个好的哈希函数可以尽可能少地产生冲突.一种广泛使用的哈希函数算法是使用数值33,假设任何字符串都是基于33的一个大整数,比如: hashcode("abcd") = (ascii(a) * 333 + ascii(b) * 332 + ascii(c) *

证明与计算(5): 从加密哈希函数到一致性哈希

目录: ** 0x01 [哈希函数] vs [加密哈希函数] ** 0x02 [哈希碰撞] vs [生日问题] ** 0x03 [哈希表] vs [分布式哈希表] ** 0x04 [欧式距离] vs [三角不等式] ** 0x05 [异或距离] vs [前缀路由表] 0x01 [哈希函数] vs [加密哈希函数] 在哈希表计算索引的时候,我们需要一个哈希函数,通过hash(key)来计算key在哈希表里的index.这个地方的哈希函数只要尽量满足均匀分布,周期尽量大,计算速度又足够快等即可.而在

几种哈希函数的比较

基本概念所谓完美哈希函数,就是指没有冲突的哈希函数,即对任意的 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函数呢

经常使用哈希函数的比較及其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函数

hash function比较

http://blog.csdn.net/kingstar158/article/details/8028635 由于工作需要,针对千万级别的数据,使用stl::map着实存在着效率问题,最后使用boost::unordered_map替代前者,发现效率上有很大的提升,但是还是无法达到我们的需求: stl::map  底层算法:B+tree 实现 boost::unordered_map 底层算法:hash 实现 所以可能要针对不同的数据类型编写hash function来优化查找和插入的效率,