哈希表也称为散列表(Hash table),是根据键(Key)直接访问内存存储位置的一种数据结构。也就是哦,我们可以通过计算一个关于键值的函数,将所需要查询的数据映射到表中一个位置来访问记录,这么一来就可以快速查找数据了。而这个映射函数我们称为散列函数,存放记录的数组称做散列表。
生活中也会经常遇到哈希表的使用案例。例如通讯录,无论手机通讯录,还是微信,qq等,可以通过昵称,备注找到对应的联系人,虽然背后的实现方式可能不同,但是都使用了哈希表的这个思想。
在编程语言中,字典(dict)通常也被称为映射(map),散列表(hash table),查找表获关联数组等。这种数据结构能够高效查找、插入和删除任何给定键关联的对象。我使用最多的编程语言是Python。在Python中,字典的键必须是可hash的(计算其唯一性),例如数字、字符串或者元组,这几种数据结构都是不可更改的(如果更改,对应变量的物理地址发生变化,可使用id()这个内建函数查看)。时间复杂度是 O ( 1 ) O(1) O(1),空间复杂度是 O ( n ) O(n) O(n),是一种比较典型的空间换时间的数据结构。
案例题目地址:无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例代码:
def lengthOfLongestSubstring(self, s: str) -> int:
tmp_set = set()
n = len(s)
pointer, res = -1, 0
for i in range(n):
if i != 0:
tmp_set.remove(s[i - 1])
while pointer + 1 < n and s[pointer + 1] not in tmp_set:
tmp_set.add(s[pointer + 1])
pointer += 1
res = max(res, pointer - i + 1)
return res
程序设计思想:使用双指针的窗口滑动以及hash表查询结合的方式。双指针分别是i,pointer。while循环就是控制窗口大小。用到hash表的就是Python中set数据结构。
小总结hash表的特点:查询快速,又能快速插入和删除元素;能在 O ( 1 ) O(1) O(1)的时间复杂度内找到某一元素,是效率最高的查找方式;同时其也是最典型的空间换时间的数据结构。
在实际编程中可以考虑结合问题合理地使用这种数据结构。



