首页 > 编程语言 >支持修改键值的优先队列(以C++,Java为例)

支持修改键值的优先队列(以C++,Java为例)

时间:2023-11-27 22:36:25浏览次数:24  
标签:std queue Java 为例 priorityQueue 键值 key pair const

#include <queue>
#include <functional>

template<typename T1, typename T2>
class mutable_priority_queue;

template<typename T1, typename T2>
class mutable_priority_queue {
private:
    std::function<bool(const std::pair<T1, T2> &, const std::pair<T1, T2> &)> comparator;
    std::priority_queue<std::pair<T1, T2>, std::vector<std::pair<T1, T2>>, decltype(comparator)> priorityQueue;
    std::unordered_map<T1, T2> Value;
    std::unordered_map<T1, bool> inQueue;

    bool check_in_queue(const std::pair<T1, T2> &);

public:
    explicit mutable_priority_queue(const std::function<bool(const T2 &, const T2 &)> &cmp
    = [](const T2 &o1, const T2 &o2) {
        return o1 > o2;
    });

    void push(const T1 &key, const T2 &value);

    std::pair<T1, T2> top();

    void pop();

    void remove_key(const T1 &key);

    size_t size();
};

template<typename T1, typename T2>
mutable_priority_queue<T1, T2>::mutable_priority_queue(const std::function<bool(const T2 &, const T2 &)> &cmp) :
        comparator([cmp](const std::pair<T1, T2> &o1, const std::pair<T1, T2> &o2) {
            return cmp(o1.second, o2.second);
        }), priorityQueue(comparator) {}


template<typename T1, typename T2>
bool mutable_priority_queue<T1, T2>::check_in_queue(const std::pair<T1, T2> &pair) {
    return inQueue[pair.first] && Value[pair.first] == pair.second;
}

template<typename T1, typename T2>
size_t mutable_priority_queue<T1, T2>::size() {
    size_t size = 0;
    for (const auto &pair: inQueue) {
        size += pair.second;
    }
    return size;
}

template<typename T1, typename T2>
void mutable_priority_queue<T1, T2>::remove_key(const T1 &key) {
    inQueue[key] = false;
}

template<typename T1, typename T2>
void mutable_priority_queue<T1, T2>::push(const T1 &key, const T2 &value) {
    Value[key] = value;
    inQueue[key] = true;
    priorityQueue.emplace(key, value);
}

template<typename T1, typename T2>
void mutable_priority_queue<T1, T2>::pop() {
    if (!priorityQueue.empty()) {
        auto topElement = top();
        inQueue[topElement.first] = false;
        priorityQueue.pop();
    }
}

template<typename T1, typename T2>
std::pair<T1, T2> mutable_priority_queue<T1, T2>::top() {
    while (!priorityQueue.empty() && !check_in_queue(priorityQueue.top())) {
        priorityQueue.pop();
    }
    return priorityQueue.top();
}
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.PriorityQueue;

class MutablePriorityQueue<T1, T2> {
    private final Map<T1, T2> map = new HashMap<>();
    private PriorityQueue<Pair> priorityQueue = null;

    MutablePriorityQueue(Comparator<T2> comparator) {
        priorityQueue = new PriorityQueue<>((o1, o2) -> comparator.compare(o1.value, o2.value));
    }

    private boolean judgeInQueue(Pair pair) {
        return map.containsKey(pair.key) && map.get(pair.key) == pair.value;
    }

    public Pair peek() {
        while (!priorityQueue.isEmpty() && !judgeInQueue(priorityQueue.peek())) {
            priorityQueue.poll();
        }
        return priorityQueue.peek();
    }

    public Pair poll() {
        Pair pair = peek();
        map.remove(pair.key);
        return pair;
    }

    public void add(T1 Key, T2 Value) {
        priorityQueue.add(new Pair(Key, Value));
        map.put(Key, Value);
    }

    public void removeKey(T1 Key) {
        map.remove(Key);
    }

    public int size() {
        return map.size();
    }

    public class Pair {
        public T1 key;
        public T2 value;

        public Pair(T1 k, T2 v) {
            key = k;
            value = v;
        }
    }
}

标签:std,queue,Java,为例,priorityQueue,键值,key,pair,const
From: https://www.cnblogs.com/HuXinIO/p/17860693.html

相关文章

  • Java的Buffer流输入封装类
    importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.util.StringTokenizer;classQuickReader{privatefinalBufferedReaderbufferedReader=newBufferedReader(newInputStreamReader(System.in));......
  • 八股文-Java方法的重载与重写
    在Java中,重载和重写是两个关键的面向对象编程概念。重载通过方法的参数列表不同来区分同名方法,提供了更灵活的方法调用方式。而重写通过子类重新定义父类中已经存在的方法,实现了多态性的体现,让代码更具可扩展性和维护性。重载(Overloading)重载是指在同一个类中可以定义多个方法......
  • Java换行输出
    Java换行输出的五种方法第一种:(println)System.out.print("#123");System.out.pritn("$123");//print--不会换行输出输出#123$123System.out.print("#123");System.out.println("$123");//println--输出时直接换行或者System.out.println("$123&......
  • JavaSE练习,JDBC驱动,基于swing库的带登录功能计算器
    一、前言本次作业是基于上次的计算器功能所做的改进,通过JDBC连接MySQL增加了登录与注册功能,并对计算器所作的运算进行了记录。虽然基于上次的作业所作,但是设计编写的模块大部分与之无关(登录注册自然与计算器无关)。所以本次作业属于再开发而不是运营维护。二、概要设计......
  • LeetCode-Java:27.移除元素
    题目给你一个数组nums和一个值val,你需要原地移除所有数值等于val的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用O(1)额外空间并原地修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。说明:为什么返回数值是整数......
  • LeetCode-Java:80.删除有序数组中的重复项 II
    题目给你一个有序数组nums,请你原地删除重复出现的元素,使得出现次数超过两次的元素只出现两次,返回删除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(1)额外空间的条件下完成。说明:为什么返回数值是整数,但输出的答案是数组呢?请注意,输入......
  • LeetCode-Java:26.删除有序数组的重复项
    题目给你一个非严格递增排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致。然后返回nums中唯一元素的个数。考虑nums的唯一元素的数量为k,你需要做以下事情确保你的题解可以被通过:更改数组......
  • 离线安装python相关库---以PyKinect2为例
    1、首先下载库的压缩包Kinect/PyKinect2:WrappertoexposeKinectforWindowsv2APIinPython(github.com)2、解压3、打开AnacondaPrompt------激活环境------切换路径到解压文件夹中setup.py所在位置------运行setup.py文件>>activatedemo_env>>cdC:\Users\Admini......
  • Java——Map.getOrDefault方法和MapUtils.getXXX()详解
    在Java编程中,Map是一种非常常用的数据结构。Map通常用于存储键值对,其中每个键映射到一个值。当我们尝试访问一个不存在的键时,Map会返回null值。这在某些情况下可能会导致错误,因此Java8引入了一个新的方法getOrDefault(),该方法可用于解决这个问题。getOrDefault()方法的语法如下:该......
  • 在Linux系统上部署Java开发环境
    简介Java是一门跨平台的编程语言,可以在各种操作系统上运行。在Linux系统上部署Java开发环境,可以让开发人员在Linux系统上进行Java开发、编译、运行和调试。环境准备在部署Java开发环境之前,需要准备以下环境:一台Linux系统的服务器或虚拟机一个终端工具,如SSH一个文件传输工......