哈希表基础
常见的三种哈希结构:
数组:出现次数有限。
set(集合):输出结果中每一结果是唯一的。
map(映射):键值对。
没有限制数值的大小就不能使用哈希表。
如果哈希值比较少,特别分散,跨度非常大,使用数组会造成空间的极大浪费。
集合 | 底层实现 | 是否有序 | 数值是否可以重复 | 能否更改数值 |
std::set | 黑红树 | 有序 | 否 | 否 |
std::multiset | 黑红树 | 有序 | 是 | 否 |
std::unordereed_set | 哈希表 | 无序 | 否 | 否 |
黑红树是一种平搜二叉搜索树,所以key的值是有序的,但key不能更改,改动会使整棵树错乱。所以只能删除和增加。
映射 | 底层实现 | 是否有序 | 数值是否可以重复 | 能否更改数值 |
std::map | 黑红树 | key有序 | key不可重复 | key不可修改 |
std::multimap | 黑红树 | key有序 | key可重复 | key不可修改 |
std::unordered_map | 哈希表 | key无序 | key不可重复 | key不可修改 |
总结:
1.当我们遇到了要快速判决一个元素是否出现在集合里的时候,就要考虑哈希法。
2.但是哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。
3.如果再做面试题的时候遇到要判断一个元素是否出现过的场景也应该第一时间想到哈希法。