• 堆(优先级队列) 的应用


     
    1. 构建哈夫曼代码怎样提升性能?

      我们知道在构建哈夫曼树时,每次要选择集合中两个最小的元素,然后将元素值相加,合并为一个新节点,此时两个最小的元素的取出可以用HeapExtractMin函数来实现,产出的新节点需要插入到堆中 我们有MinHeapInsert函数来实现。

      之前我们遇到哈夫曼编码,往往关注的是其思想,然而每次取出最小的2个元素的过程,却涉及到排序、求极值的问题。这时候用堆来维护这个队列,每次还能将取出的两个最小值的和插到堆里,非常方便,减少了运行时间。


    2. 计算大型浮点数集合的和

      有一个很普遍的情况,我们知道浮点数的存储都有精度,遇到大浮点数和小浮点数相加,很可能会造成精度误差。所以可以每次从优先级队列中取出最小的两个数相加,和1的实现差不多。


    3. 在具有10亿个数值的集合中找到100万个最大的数

      这个就是TOP(K)问题了,可以建立100万个元素的最小二叉堆,后面的数和根部进行比较,如果大于根部,进行堆调整


    4. 将多个小型有序文件合并到一个大型有序文件中
      该问题我整理成了另一篇文章。里面附有源码测试;
      假设有 n个 小型有序文件,建立一个大小为n的最小堆,每个有序文件贡献一个(如果有的话),每次取出最小值插入到大型文件中,并且去掉该最小元素,并将它在文件中的后续元素插入到堆中,能够在o(lgn)的时间内从n个文件中选择要插入到大型文件中的元素。
      意思就是,维护一个堆,该堆存放了所有小文件的最小值。每次取出最小值min(属于小文件A),将小文件A的下一个最小值再插入到A。持续下去,问题解决。
  • 相关阅读:
    Django基础(一)_URLconf、Views、template、ORM
    MySQL数据库(8)_MySQL数据库总结
    MySQL数据库(6)_用户操作与权限管理、视图、存储过程、触发器、基本函数
    前端基础之jquery_mouse相关操作与不同
    前端基础之jquery
    前端基础之JavaScript_(5)_DOM对象总结
    前端基础之JavaScript_(4)_js的作用域
    前端基础之JavaScript_(3)_DOM对象
    MSB与LSB Big Endian Little Endian
    samba配置
  • 原文地址:https://www.cnblogs.com/leeeee/p/7276460.html
Copyright © 2020-2023  润新知