文章目录
用哈希表和堆处理的问题
- 查询、插入、删除的操作要远多于其余的操作的情况下使用哈希表。
- 在动态环境中需要快速获取最值的情况下使用堆。
代码注意事项
-
哈希表——insert:O(1),find:O(1),delete:O(1)
closed hashing:一个位置只放一个元素,冲突的元素向后寻找空位放下。
(缺点:由于find时有些元素被当作寻找正确元素的桥梁,所以在元素删除时候不能直接置空,而改为标记为delete,依然充当桥梁,多次操作后可能产生很多delete位置,影响性能)
open hashing:一个位置存放一个链表,新元素插入时从表头插入,find时不需要向后寻找,只需要遍历该位置的链表即可。哈希表的空间通常远大于需要存储的序列的元素个数,哈希size >> 数组size,通常大一个数量级,当哈希表的饱和度大于1/10的时候则需要rehash;
哈希函数取模的一些技巧:
(a+b)%c = (a%c+b%c)%c
(a-b)%c = (a%c-b%c)%c
(ab)%c = ((a%c)(b%c))%cc++中的哈希相关的数据结构以unordered开头(unordered_set、unordered_map等)。
-
堆——push:O(log n),pop:O(log n),top:O(1)
c++中的堆数据结构又叫优先队列,即
priority_queue
。
时间复杂度分析
-
哈希表
插入insert:O(1)
查询find:O(1)
删除delete:O(1) -
堆
元素入堆push:O(log n)
弹出堆顶pop:O(log n)
查询堆顶top:O(1)
题目汇总
- 重哈希(Rehashing)https://blog.csdn.net/SeeDoubleU/article/details/124600762
- LRU缓存-最近最少使用策略(LRU Cache)https://blog.csdn.net/SeeDoubleU/article/details/124656824
- 丑数(Ugly Number)https://blog.csdn.net/SeeDoubleU/article/details/124657720
- 丑数II(Ugly Number II)https://blog.csdn.net/SeeDoubleU/article/details/124657738
- 前K大数(Top k Largest Numbers)https://blog.csdn.net/SeeDoubleU/article/details/124657747
- 前K大数 II(Top k Largest Numbers II)https://blog.csdn.net/SeeDoubleU/article/details/124657757
- 合并k个排序链表-多路归并排序(Merge K Sorted Lists)https://blog.csdn.net/SeeDoubleU/article/details/124657763