【HBZ分享】java之二叉堆的TopK问题

什么是TopK问题?

  1. 比如从100亿数据筛选出最小的K个数,或者最大的K个数

如何解决这类问题?

  1. 利用大顶堆 或 小顶堆来解决
  2. 当取最大K个数时使用小顶堆,取最小10个数时用大顶堆,叫取大用下,取小用大。

设计思想(比如取最小的10个数)

  1. 将100亿数据中随便取10个数,放到二叉堆中,将10个元素构建成大顶堆

  2. 将100亿个数据分别和大顶堆的第一个元素对比
    (1). 如果对比元素小于大顶堆的第一个元素,则将大顶堆第一个元素替换成比较的数字,然后重新堆化
    (2). 如果对比元素大于大顶堆的第一个元素,直接比较下一个,不需要做任何操作,因为大顶堆第一个元素一定是最大的,无需和下面的再比较了,直接换下个元素比较

  3. 直到对比到最后一个元素为止,大顶堆里面剩余的元素就是最小的10个数

你可能感兴趣的:(java,算法,开发语言)