LintCode 128 [Hash Function]

原题

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

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

解题思路:

  • 关于哈希表:

  • 哈希表在内存中是一个事先开辟好的数组,通过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:
    """
    @param key: A String you should hash
    @param HASH_SIZE: An integer
    @return an integer
    """
    def hashCode(self, key, HASH_SIZE):
        sum = 0
        for char in key:
            sum = sum * 33 + ord(char)
            sum = sum % HASH_SIZE
        return sum
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 【题目描述】 In data structure Hash, hash function is used to c...
    程风破浪会有时阅读 2,828评论 0 0
  • 1、踩踏事件频发,折射出的是监管的失位、资源的失衡以及心态的忽视。只有从心理上对于校园安全重视了,行动上才能积极主...
    加油冲哇阅读 1,522评论 0 0
  • 伴着晨曦与朝露 带着虔诚与慈悲 一袭花香,路遇一场 这一世的路人啊 星月会为你点灯 菩提将予你安和 你会叩一拜吗 ...
    半人说阅读 2,415评论 0 0
  • 程序员如何实现游历各大公司技术部?答案当然是面试啊! 为什么写这些面后感呢?有人会猜因为这些都是我的仇人嘛,没有一...
    印林泉阅读 3,483评论 3 2
  • 脑袋瓜里面有一大堆奇思妙想,但是却无从落笔,想落笔的时候却又没有时间。难得有个如此美妙的早上,可以把自己的胡思乱想...
    诚公子阅读 2,924评论 0 1

友情链接更多精彩内容