堆的应用

本文介绍了一种使用堆数据结构高效查找文件中1亿个随机整数中的最小100万个数字的方法。通过构建初始堆并不断更新,最终实现快速筛选。

个文件中包含了1亿个随机整数,如何快速的找到最大(小)的100万个数字?这类问题其实就是“优先树”算法,用堆(Heap)很容易解决。首先用含100万个数字的数组组成堆。从文件间读取数字,并插入到Heap中。如果 Heap已经满了,则删除根节点,并重整;直到所有的数字均处理完毕。

堆排序是Heap的副产品,其实它大部分时间是用在“优先决策”上,上面的例子只是其中之一,其他场所比如操作系统的任务调用、优先队列等。

public static Comparable[] findMin(int count, String fileName) {
  Heap heap = new Heap(count);
  try {
    BufferedReader br = new BufferedReader(new FileReader(fileName));
    String line;
    while((line = br.readLine()) != null) {
      Integer number = Integer.valueOf(line);
      if(heap.isFull())
        heap.delete();
      heap.insert(number);
    }
  catch (FileNotFoundException e) {
    e.printStackTrace();
  catch (NumberFormatException e) {
    e.printStackTrace();
  catch (IOException e) {
    e.printStackTrace();
  }
  Comparable[] ret = new Comparable[count];
  int index = count - 1;
  while(!heap.isEmpty()) {
    ret[index--= heap.delete();
  }
  return ret;
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值