Loading

cpp hash

一般哈希表都是用来快速判断一个元素是否出现集合里 。 比如找到一个学生,在不在队列里,这种查找问题,使用 hash 表,可以快速执行。

hash 函数 :用于将需要填充的值或者索引,映射到hash table 的索引上。
哈希碰撞 : 如果 两个事物的 hash value 相同, 则出现hash 碰撞。一般哈希碰撞有两种解决方法, 拉链法和线性探测法。
常见hash结构 : 数组,set,map

c++ 同的 hash 结构 :

集合 底层实现 是否有序 数值是否可以重复 能否更改数值 查询效率 增删效率
std::set 红黑树 有序 O(log n) O(log n)
std::multiset 红黑树 有序 O(logn) O(logn)
std::unordered_set 哈希表 无序 O(1) O(1)
set 和 multiset 的key是有序的,不能修改
映射 底层实现 是否有序 数值是否可以重复 能否更改数值 查询效率 增删效率
std::map 红黑树 key有序 key不可重复 key不可修改 O(logn) O(logn)
std::multimap 红黑树 key有序 key可重复 key不可修改 O(log n) O(log n)
std::unordered_map 哈希表 key无序 key不可重复 key不可修改 O(1) O(1)
map 同理

当我们要使用集合来解决哈希问题的时候,优先使用unordered_set,因为它的查询和增删效率是最优的,如果需要集合是有序的,那么就用set,如果要求不仅有序还要有重复数据的话,那么就用multiset。

三数之和

剪枝操作:

num[i] == num[i+1] --> continue //结果集中不能又相同的值
num[i-1] == num[i] --> continue //开头两个字母重复,---> 此状态出现过,无需再次运算

i 确定了 ,剩下两个同理

posted @ 2024-05-17 19:36  big_shark  阅读(30)  评论(0)    收藏  举报