文章内容基本内容借鉴于“代码随想录”,个人整理以备复习使用
哈希表基本思想
哈希表用于快速查找目标值是否出现在一个集合中。
基本思想是使用哈希函数,将目标值转换为哈希表中的索引值,从而使查找时直接将目标值再次通过哈希函数的计算得到索引值即可,而不必逐个遍历去搜索。
常见的三种哈希结构:数组、set、map
1、数组
数组是最简单的一种哈希表实现,当目标值的范围不大时,可以直接以空间换时间的思想,创建数组,使目标值本身的值作为数组的下标,查找该值是否存在时即可直接使用array[target_value]实现。
2、集合 set
C++11的标准库中包含了三种类型的set(map也是):set、multiset、unordered_set

其中set和multiset的底层实现均为红黑树,红黑树是平衡二叉搜索树的一种,因此二者都是有序且高效的,查询效率和增删效率均取决于树的高度(即O(log n),且由于树是平衡的,不会出现斜树导致的低效极端情况)。但同样由于树有序的特性,其值是不能修改的,不然会破坏红黑树的有序性。
multiset根据名字就可以发现其数值可以重复的特性,其和set的区别可以类比二叉搜索树中是否允许根节点的值等于其中序遍历的前后相邻值。
unordered_set是名副其实的哈希表,其底层实现就是上文中提到的使用哈希函数实现的哈希表,因此其存储是无序的,不可以有重复值,且不允许修改(修改需要重新计算哈希索引,相当于删了重新加入),哈希表的特性是高校的查询和增删,复杂度均为O(1)。
三者的选择:如果仅需要使用哈希表的思想,想要快速查询和增删,则优先选择unordered_set,若又要求集合有序,则可以考虑set,若进一步要求集合的元素可以重复,则使用multiset。
值得注意的是,集合本身存储的是“key”型值,即只能用来判断集合中某个元素是否存在。若要统计某个元素出现的次数等“key-value”二值型数据,则可以考虑映射 map。
3、映射 map
C++11中map包括map、multimap、unordered_map三种类型,基本与上面的set对应。

map和set最大的区别就在于map是"key-value"型的数据结构,其中key像set一样是不可修改的,其他基本对应相同,不再赘述。
4、应用题目
数组作为哈希表
前面说过,如果目标值的范围很有限,可以直接使用数组作为哈希表,例如leetcode 242.有效的字母异位词:

目标值只有26个英文字母,因此使用一个大小为26的数组来统计字符串s中每个字母的出现次数,再遍历字符串t,每遇到一个字母则将数组对应值减1,当数组出现负数值或遍历结束后有不为零的值时说明二者不是字母异位词,否则是。
class Solution {
public:
bool isAnagram(string s, string t) {
int Hash[26] = {
0};
int sLen = s.size(), tLen = t.size();

本文详细介绍了C++中哈希表的基本思想,包括数组、set(红黑树实现)、map的使用,以及它们在实际问题中的应用,如字母异位词判断、交集查找和两数之和。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



