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

    优先队列的实现

      优先队列是拥有权值观念的队列,它允许加入新元素,移除旧元素、审视元素值等功能。由于这是一个queue,所以只允许在底端加入元素,并从顶端取出元素,除此之外无其他存取元素的途径。

      优先队列带有权值观念,其内的元素并非按照被推入的次序排列,而是自动依照元素的权值排列(通常权值以实值表示)。权值最高者,排在最前面

     1 #include<cstddef> //std::size_t
     2 #include<algorithm> //std::swap
     3 #include<vector>
     4 
     5 template<typename T> class PriorityQueue {
     6 public:
     7     PriorityQueue(){}
     8 
     9     bool empty() {
    10         return data.empty();
    11     }
    12 
    13     size_t size() {
    14         return data.size();
    15     }
    16 
    17     T& top() {
    18         return data.front();
    19     }
    20 
    21     void push(const T& val) {
    22         data.push_back(val);
    23         push_heap();
    24     }
    25 
    26     void pop() {
    27         if (data.empty())
    28             return;
    29 
    30         pop_heap();
    31         data.pop_back();
    32     }
    33 
    34 private:
    35     void push_heap() {
    36         int i = data.size() - 1;
    37         T temp = data[i];
    38 
    39         for (; i > 0 && temp > data[(i-1) / 2]; (i-1) /= 2) {
    40             data[i] = data[(i-1) / 2];
    41         }
    42 
    43         data[i] = temp;
    44     }
    45 
    46     void pop_heap() {
    47         std::swap(data[0], data[data.size() - 1]);
    48         int heap_end = data.size() - 2;
    49 
    50         percolatedown(0, heap_end);
    51     }
    52 
    53     void percolatedown(int i, int heap_end) {
    54         T temp = data[i];
    55 
    56         for (int child = 2 * i + 1; child <= heap_end; child = 2 * child + 1) {
    57             if (child < heap_end && data[child] < data[child + 1])
    58                 ++child;
    59 
    60             if (temp < data[child]) {
    61                 data[i] = data[child];
    62                 i = child;
    63             } else {
    64                 break;
    65             }
    66         }
    67 
    68         data[i] = temp;
    69     }
    70 
    71     std::vector<T> data;
    72 };
  • 相关阅读:
    基于Dubbo的压测调优实例
    R语言之Apriori算法应用
    Linux中的用户和组
    R语言中的循环及其扩展:iter和foreach
    R在Windows下连接Oracle数据库
    R语言之机器学习程序包(更新)
    R语言之数据结构
    windows环境下node安装教程(超详细)
    windows环境下elasticsearch安装教程(超详细)
    MongoDB分片介绍
  • 原文地址:https://www.cnblogs.com/vincently/p/4198680.html
Copyright © 2011-2022 走看看