哈希表与哈希集合基本知识
哈希表
哈希表又叫作散列表,有键值对,常用于统计词频或其他mapping关系。
数组其实也属于一种哈希表。其索引就相当于key,该位置存储的值就是value。
创建过程:key→哈希函数→内存地址→key | value 对应的内存地址
哈希碰撞:两个不同的key通过同一个hash函数得到相同的内存地址。
解决:
- 拉链法(Seperate Chaining),又叫 Open Hashing:在冲突的元素用链表的方式指向下一个元素(较常用)
- 线性探测法(Linear Probing),又叫Open Addressing, Close Hashing:一定要保证tableSize大于dataSize。当遇到冲突时,向后寻找空位填入元素。
复杂度分析:
- 哈希表没有访问这个概念
- 搜索:对key搜索是否存在该key。O(1),如果出现哈希碰撞:O(k),k为碰撞元素的个数(拉链法)。
- 插入:通过key插入value值,O(1)
- 删除:通过key删除value,O(1)
空间复杂度非常高
哈希集合
特征:无序,不重复
作用:检查某元素是否存在;重复元素
链表集合和树集合很少用到。
过程:元素通过哈希函数转换为哈希值,在哈希表对应位置里查找有无元素。
有:对比是否相等。相等:更新。不相等:哈希冲突。
无:直接存
- 访问:不适用
- 搜索:无哈希冲突:O(1);有哈希冲突:O(k)
- 插入:无哈希冲突:O(1);有哈希冲突:O(k)
- 删除:无哈希冲突:O(1);有哈希冲突:O(k)
Python 中字典和集合的区别
参见@及时行樂_的详细整理。
LC242 有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
示例 1: 输入: s = "anagram", t = "nagaram" 输出: true
示例 2: 输入: s = "rat", t = "car" 输出: false
说明: 你可以假设字符串只包含小写字母。
题目中限定小写字母很关键,暗示我们可以利用数组和ASCII码来轻松解决这道题。
- 先遍历一次
s
,统计词频并记录到table
- 然后遍历一次
t
,将对应元素的频率减一 - 最后检查
table
中