哈希表和堆的总结

用哈希表和堆处理的问题

  1. 查询、插入、删除的操作要远多于其余的操作的情况下使用哈希表。
  2. 在动态环境中需要快速获取最值的情况下使用堆。

代码注意事项

  1. 哈希表——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))%c

    c++中的哈希相关的数据结构以unordered开头(unordered_set、unordered_map等)。

  2. 堆——push:O(log n),pop:O(log n),top:O(1)

    c++中的堆数据结构又叫优先队列,即priority_queue

时间复杂度分析

  1. 哈希表

    插入insert:O(1)
    查询find:O(1)
    删除delete:O(1)

  2. 元素入堆push:O(log n)
    弹出堆顶pop:O(log n)
    查询堆顶top:O(1)

题目汇总

  1. 重哈希(Rehashing)https://blog.csdn.net/SeeDoubleU/article/details/124600762
  2. LRU缓存-最近最少使用策略(LRU Cache)https://blog.csdn.net/SeeDoubleU/article/details/124656824
  3. 丑数(Ugly Number)https://blog.csdn.net/SeeDoubleU/article/details/124657720
  4. 丑数II(Ugly Number II)https://blog.csdn.net/SeeDoubleU/article/details/124657738
  5. 前K大数(Top k Largest Numbers)https://blog.csdn.net/SeeDoubleU/article/details/124657747
  6. 前K大数 II(Top k Largest Numbers II)https://blog.csdn.net/SeeDoubleU/article/details/124657757
  7. 合并k个排序链表-多路归并排序(Merge K Sorted Lists)https://blog.csdn.net/SeeDoubleU/article/details/124657763

猜你喜欢

转载自blog.csdn.net/SeeDoubleU/article/details/124657817