zoukankan      html  css  js  c++  java
  • 优先队列(堆)

    在打印机作业时一般采用队列的形式FIFO(fisrt in first out),但遇到一个1份的和一个100份的作业时,先打印1份的相对合理;另外,不同作业的优先级也不同,优先级高的应该先处理。

     insert == Enqueue

    deleteMin == Dequeue

    二叉堆(完全二叉树):除了底层,一棵被完全填满的二叉树,底层上元素从左到右填入。

    完全二叉树很有规律,可用数组表示:对于任一节点元素X,其父节点元素H->element[i/2],其左儿子H->element[2i],右儿子H->element[2i+1]。

      A B C D E F G H I  J  

    0 1 2 3 4 5 6 7 8 9 10 11 12 13 

    一个堆的数据结构:一个数组、容量、当前堆大小。

    注意事项:

    节点声明:

    struct heap
    {
           int           capacity;
           int           size;
           elementType   *elements;
    }

    堆序性:节点X的关键字 大于等于  节点X父亲节点的关键字。

    priority queue creat:

    priorityQueue *initialize( int maxElement)
    {
           priotityQueue *H;
           if (maxElement < minPQSize)
           {
                 cout << "priorityQueue is too small" << endl;
                 return NULL;
           } 
           H->elements = New element[maxElement + 1];
           if(H->elements == NULL)
           {
                 cout << "out of space" << endl;
                 return NULL;
           }
           H->capacity = maxElement;
           H->size = 0;
           //minData为足够小的数,保证元素插入后最多上滤到i=1处,即根节点。
           H->elements[0] = minData; 

    return H;
    }

     insert:(末端插入)

    void insert (elementType X , PriotityQueue *H)
    {
           if (isFull (H))
           {
               cout<< "out of space" << endl;
               return;
           }
           // H->elements[0]是一个足够小的数minData,保证X<minData不成立。
           for(int i = ++H->size; X < H->elements[i/2]; i/=2) 
    H
    ->elements[i] = H->elements[i/2];
    H
    ->elements[i] = X;
    }

     deleteMin(根处删除)

    elementType deleteMin(priorityQueue *H)
    {
           int child;
           elementType minElement , lastElement;
    
           if(isEmpty(H))
           {
                 cout << "priotityQueue is empty" << endl;
                 return H->elements[0];
           }
           minElement = H->elements[1];
           lastElement = H->elements[H->size--];//保存最后一个元素,size-1
              
           for( int i = 1; 2*i <= H->size; i = child)
           {
                 child = 2*i;
                 if(child != H->size && H->element[child + 1] < H->element[child])
                    child++;
                 if(H->element[child]<lastElement)  
                    H->element[i] = H->element[child];  //由二叉堆的堆序性可知min堆的节点X < 其儿子节点
                 else 
                    break;
           }
           H->elements[i] = lastElement;
           return minElement;
    }
  • 相关阅读:
    用 Mac 给树莓派重装系统
    Python:matplotlib 中文乱码的解决方案
    Python: 通过 pip 安装第三方包后依然不能 import
    Python: 安装 sklearn 包出现错误的解决方法
    grub2引导安装kali2.0及安装ibus拼音输入法
    2015移动安全挑战赛 第一题
    Linux kali 3.14-kali1-amd64 编译安装 wine 1.7.33
    git clone https协议问题
    常见问题
    Sieve_of_Eratosthenes
  • 原文地址:https://www.cnblogs.com/Lunais/p/5579092.html
Copyright © 2011-2022 走看看