• lintcode-->哈希函数


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

    解题思路:

    • 关于哈希表:

    • 哈希表在内存中是一个事先开辟好的数组,通过hash function把一个key转化为某一个index,来实现O(1)的查找

    • 理想状态下,每次算出的index都是唯一的,而实际上会有Collision

    • hash function设计标准是越乱越没有规则越好,以避免Collision,一般是通过某种方式将key转化为一个integer然后对hash table size取模

    • 哈希表的size最好要是所要存的数字数量的10倍,当size不够时,需要rehashing。

    • 如何处理冲突 - Collision

    • Open hashing - 冲突的话,index下面采用linked list

    • Closed hashing - 如果有冲突,则向前或者向后位移。致命缺点,不支持删除,所以几乎没人采用

    • 将key转化为整数的方式有:

    • MD5, 但是耗费较大

    • APR hash function - magic number 33(只是经验值)

    • Python中char和integer之间的转换

    >>>ord("a")
    97
    >>>chr(97)
    'a'
    
    • 小技巧,如何计算a * 33^3 + b * 33^2 + c * 33 + d
    sum = a * 33
    sum = (a * 33 + b) * 33
    sum = (a * 33^2 + b * 33 + c) * 33
    sum = (a * 33^3 + b * 33^2 + c * 33 + d) * 33
    ...
    

    完整代码

    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
    l    ong sum=key[0];
        for(int i=1;i<key.length();i++)
        {
          sum=sum * 33 % HASH_SIZE + (int)key[i];
        }
        return sum%HASH_SIZE;
       }
    };


    解题方法来源:
    作者:Jason_Yuan
    链接:http://www.jianshu.com/p/9a67268b5a94
    來源:简书
  • 相关阅读:
    javascript通用循环遍历方法forEach
    伪数组
    引用和基本类型
    谈谈Javascript的this指针
    理解内存分配
    理解undefined和null
    getElementsByClassName实现
    NSubstitute完全手册(十五)自动递归模拟
    NSubstitute完全手册(十七)参数匹配器上的操作
    NSubstitute完全手册(九)检查接收到的调用
  • 原文地址:https://www.cnblogs.com/zgq0/p/8021891.html
Copyright © 2020-2023  润新知