Youtube上看到一个小哥讲的Hash Table,讲清它的原理和结构之后又带着从零开始实现了构造哈希函数、创建哈希表、增加/删除数据等一系列系统的操作,讲解和示例清晰完整,丝毫不拖泥带水,大赞。
链接
需要科学上网,有强烈欲望想要看的同学可以参考之前这篇ubuntu下服务器搭建的博客,自己配置外网服务器
哈希表
哈希表(Hash Table),是一种数据结构。它通过计算一个关于键值的函数,将所需查询的数据映射到表中的一个位置来访问,这加快了查找的速度。STL中的map就是哈希表的一种实现。
键值可以是字符串或者其它较为复杂的类型,下面以字符串为例。若将它们直接存储在数组里,当想要访问它们的时候只能O(n)复杂度的遍历一遍。但是通过构造哈希函数,我们可以首先将这个字符串映射为一个整数类型,将这个整数作为它们所在数组位置的下标,这样当我们想要访问某一个字符串,只需要把它送到哈希函数里得到一个返回的哈希值,也就是它所在数组位置的下标,就能以O(1)的复杂度访问它。
哈希函数的构造方法有很多,但一般我们得不到一个完美的哈希函数,即可能会存在两个字符串它们对应的哈希值相同。为了应对这种冲突,我们可以把数组的每个位置当做链表,存在多值时就链接到链表后面。如上图所示。
代码
边听着小哥的讲解边写的代码,包括了构造哈希函数、创建哈希表、增加/删除数据等操作。
1 |
|