网站负责人 法人,python网站开发书籍推荐,品牌网站建设市场分析,一起做网站广州内容来自#xff1a;代码随想录#xff1a;哈希表理论基础
1.常见的三种哈希结构
当我们想使用哈希法来解决问题的时候#xff0c;我们一般会选择如下三种数据结构 数组 set #xff08;集合#xff09; map(映射) 在C中#xff0c;set 和 map 分别提供以下三种数据结构…内容来自代码随想录哈希表理论基础
1.常见的三种哈希结构
当我们想使用哈希法来解决问题的时候我们一般会选择如下三种数据结构 数组 set 集合 map(映射) 在C中set 和 map 分别提供以下三种数据结构其底层实现以及优劣如下表所示 std::unordered_set底层实现为哈希表std::set 和std::multiset 的底层实现是红黑树红黑树是一种平衡二叉搜索树所以key值是有序的但key不可以修改改动key值会导致整棵树的错乱所以只能删除和增加。
std::unordered_map 底层实现为哈希表std::map 和std::multimap 的底层实现是红黑树。同理std::map 和std::multimap 的key也是有序的这个问题也经常作为面试题考察对语言容器底层的理解。
当我们要使用集合来解决哈希问题的时候优先使用unordered_set因为它的查询和增删效率是最优的如果需要集合是有序的那么就用set如果要求不仅有序还要有重复数据的话那么就用multiset。
那么再来看一下map 在map 是一个key value 的数据结构map中对key是有限制对value没有限制的因为key的存储方式使用红黑树实现的。
其他语言例如java里的HashMap TreeMap 都是一样的原理。可以灵活贯通。
虽然std::set、std::multiset 的底层实现是红黑树不是哈希表std::set、std::multiset 使用红黑树来索引和存储不过给我们的使用方式还是哈希法的使用方式即key和value。所以使用这些数据结构来解决映射问题的方法我们依然称之为哈希法。 map也是一样的道理。
这里在说一下一些C的经典书籍上 例如STL源码剖析说到了hash_set hash_map这个与unordered_setunordered_map又有什么关系呢
实际上功能都是一样一样的 但是unordered_set在C11的时候被引入标准库了而hash_set并没有所以建议还是使用unordered_set比较好这就好比一个是官方认证的hash_sethash_map 是C11标准之前民间高手自发造的轮子。