zoukankan      html  css  js  c++  java
  • 最小堆_最大堆

    在大数查找中会遇到一类问题,例如在100亿条数据中找出 最大的(最小的) 前1000个元素。以int型4Byte为例,有1*1010*4 B = 4*1010/(230) B = 37.25G。

    直接读取到内存中显然不合适,那么就需要:

    首先,读取前1000个元素,建立一个最小堆(最大堆

    其次,之后每读取一个元素就与最小堆根元素(1000个数中最小值)进行比较;

    如果,新元素大于(小于堆顶元素

    则,删除堆顶元素,将新元素插入堆顶。然后调整堆序,删除堆顶。。。。循环往复

    #define leftChild(i)  (2*(i)+1)  //i = N-1时,(i)的优势就体现出来了
    
    void interChange(elementType A[], int i, int N)
    {
         int child;
         elementType tem;
         for(tem = A[i]; leftChild(i) < N; i = child) //每次调用都是从节点i开始的下滤过程。从0开始的前几个i有循环过程,后面几个到N/2都只有一次比较。
         {
             child = leftChild(i);
             if(child != N-1 && A[child+1] > A[child])
                child++;
             if(tem < A[child])   //保证在任意数组下,建立起最大堆
             A[i] = A[child];
             else
                 break;
          }
          A[child] = tem;
    }
    void heapSort (elementType A[], int N)
    {
           int i; 
           for(i = N/2; i >=0; i--)   //也可以用for(i = 0;2*i<N;i++)
               interChange(A, i, N);  //builfMaxHeap
    
           for(i = N-1; i > 0; i--)
           {
               swap(&A[0], &A[N-1]);  //deleteMax
               interChange(A, 0, i ); //在堆序性下,删除了最大元素后,从堆顶开始下滤,直至叶子节点
           }     
    }
  • 相关阅读:
    JavaScript事件冒泡简介及应用
    个人作业——软件工程实践总结&个人技术博客
    个人技术总结
    个人作业——软件测评
    寒假作业(2/2)
    寒假作业(1/2)
    gitlab-ci.yml可用关键字描述
    gitlab-Runner配置参数详解
    gitlab-ci部署实现持续集成(centos7)
    linux时间同步操作命令
  • 原文地址:https://www.cnblogs.com/Lunais/p/5603906.html
Copyright © 2011-2022 走看看