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

最新文章

  1. Linux网卡bounding详解
  2. LeetCode 242 Valid Anagram
  3. eclipse 中添加工程 Some projects cannot be imported because they already exist in the workspace
  4. 在CentOS 6.4中编译安装gcc 4.8.1
  5. Groupon面经:Find paths in a binary tree summing to a target value
  6. Java 集合系列 13 WeakHashMap
  7. ActiveMQ(5.10.0) - 删除闲置的队列或主题
  8. LINUX系统GIT使用教程
  9. 关于国产跨平台的开源游戏引擎LGame
  10. iOS纯代码工程手动快速适配
  11. freemarker 类型转换
  12. MVC和MTV模式
  13. 用 Java 解密 C# 加密的数据(DES)(转)
  14. 跟我一起用node-express搭建一个小项目(node连接mongodb)[三]
  15. 第四节,Neural Networks and Deep Learning 一书小节(上)
  16. [svc]容器网络学习索引及网络监控
  17. vivado/FPGA 使用小纪
  18. 图结构练习——判断给定图是否存在合法拓扑序列(sdutoj)
  19. arugsJS 入门
  20. ubuntu16.04 python3.5 opencv的安装与卸载(转载)

热门文章

  1. Lucene.net 性能《第八篇》
  2. HDU6205 Coprime Sequence 2017-05-07 18:56 36人阅读 评论(0) 收藏
  3. Win窗口坐标二维坐标与OpenGl的世界坐标系的之间的相互转换
  4. Spark RDD详解
  5. 软件工程作业 - 实现WC功能(java)
  6. &lt;context:component-scan&gt;自动扫描
  7. delphi 6数据库连接之长短模式(sqlserver)
  8. Keil5编译STM32注意事项
  9. Spring Boot 2 实践记录之 Powermock 和 SpringBootTest
  10. telerik自定义皮肤的制作及用法