一刷是用Python写的,所以在哈希表的三种结构那里有点区别
哈希表(Hash table,散列表)
- 官方解释:哈希表是根据关键码的值而直接进行访问的数据结构
- 例如数组就是一个哈希表,关键码就是下标索引,通过关键码下标访问数组元素
- 应用:快速判断元素是否出现在集合中
- 创造哈希表:哈希函数(hash function)
- 以下说明以,判断学生姓名是否在该所学校中为例
哈希函数
-
哈希函数作用:把学生姓名映射为哈希表上的索引,以便于通过查询索引判断学生是否在学校中
-
hashCode:通过特定编码方式,将其他数据格式转化为不同的数值
-
特殊情况:①hashCode数值大于哈希表大小(tablesize):对数值取模
②学生数量大于哈希表大小:有几位学生名字同时映射到哈希表的同一个下标索引中,引出哈希碰撞
哈希碰撞
常见的三种哈希结构
- 数组
- set集合
- map映射
总结
- 遇到了要快速判断一个元素是否在集合里时,应用哈希法
- 哈希法牺牲了空间换取了时间,需要额外的数组、set、map来存放数据
242.有效的字母异位词
- ascii码中的大写字母从65开始,小写字母从97开始,48~57为0-9的阿拉伯数字
- 我用了两个数组来依次记录两个数组的哈希表,然后比较是否相等;卡尔则只用一个数组,遍历一个字符串记录,遍历另一个字符串删减,最后判断数组是否全为0
拓展题目- 383.赎金信,同242
- 49.字母异位词分组,没写出来,官方答案用的是
unordered_map<string,vector<string>> mp
数据结构,对字符串排序sort(key.begin(), key.end())
,插入元素mp[key].emplace_back(str)
;迭代器for(auto it = mp.begin(); it != mp.end(); ++it
unordered_map<string, vector<string>> mp; for(string& str : strs){ string key = str; sort(key.begin(), key.end()); mp[key].emplace_back(str); } vector<vector<string>> ans; for(auto it = mp.begin(); it != mp.end(); ++it){ ans.emplace_back[it->second); } return ans;
- 438.找到字符串中所有字母异位词,滑动窗口+哈希表,int数组不能直接判断是否相等
349. 两个数组的交集
- 正常用数组做没问题
- 这道题主要要学习
unordered_set
这种哈希数据结构
unoedered_set<int> result_set
result_set.finid(找元素)
vector<int>(result_set.begin(), result_set.end()) //set转vector
拓展题目- 350.两个数组的交集||
202. 快乐数
- 首先,如何将数字n(如2453)变换为数字2、4、5、3就遇到了问题,用n%10
- 写个函数计算sum
- 用set哈希表记录该sum是否出现过,是否进入循环了
unordered_set<int> result_set; //创建新set
while(result_set.find(n) == result_end()) //循环条件:查找set中是否有n元素,
//若没有则返回set末尾的迭代器
result_set.insert(n); //插入元素
1.两数之和
- 用map数据结构,定义:
unordered_map<int,int> map;
- 寻找元素:
auto iter = map.find(n);
- 找不到就返回
map.end()
- 插入元素
map.insert(pair<int, int>(nums[i], i);
- 需要学习set、map的用法