优先队列的优先级总是需要积分?

时间:2011-11-05 21:30:09

标签: data-structures priority-queue

我只是好奇我是否可以使用任何其他数据类型来优先考虑?像字符串,花车等?

4 个答案:

答案 0 :(得分:3)

在摘要中,任何具有合理Strict Weak Ordering的类型都可以用作优先级队列中的优先级。您正在使用的语言将决定如何定义此排序:在C ++中,运算符<在Java中使用标准容器,通常使用接口Comparable和function compareTo。还经常支持自定义比较函数,它可以以不同于默认值的方式比较元素。

答案 1 :(得分:1)

没有

优先级队列的排序元素不必是整数。

您可以使用您想要的任何类型,只要可以比较该类型的两个值以确定它们的固有顺序。

基本上,您可以构建一个使用您想要的任何类型的优先级队列,如果您可以确定对这些类型有意义的排序,即使是复杂的数字。

然而,这里有另一个未提出的问题,答案是:

是的,优先级队列的大多数现有实现都将使用整数作为排序元素,因为这是用于此目的的最简单,最常见的值。

答案 2 :(得分:1)

这是一个关于如何排队SillyJobs的完整C ++演示,定义为

struct SillyJob
{
    std::string description;
    std::string priority;
    // ...
};

它以两种方式实现:使用成员operator<(默认)并将显式比较谓词传递给priority_queue构造函数。

让我们先看看输出:

Silly: (by description length)
LOW: very very long description
HIGH: short
------------------------------------------------------------
Not so silly: (by priority value)
HIGH: short
LOW: very very long description

http://ideone.com/VEEQa

上查看
#include <queue>
#include <algorithm>
#include <functional>
#include <iostream>
#include <string>
#include <map>

struct SillyJob
{
    std::string description;
    std::string priority;

    SillyJob(const std::string& d, const std::string& p)
        : description(d), priority(p) { }

    bool operator<(const SillyJob& sj) const { return description.size() < sj.description.size(); }

    friend std::ostream& operator<<(std::ostream& os, const SillyJob& sj)
    { return os << sj.priority << ": " << sj.description; }
};

static bool by_priority(const SillyJob& a, const SillyJob& b)
{
    static std::map<std::string, int> prio_map;
    if (prio_map.empty())
    {
        prio_map["HIGH"]   = 3;
        prio_map["MEDIUM"] = 2;
        prio_map["LOW"]    = 1;
    }

    return prio_map[a.priority] < prio_map[b.priority];
}

int main()
{
    std::cout << "Silly: (by description length)" << std::endl;
    {
        // by description length (member operator<)
        std::priority_queue<SillyJob> silly_queue;

        silly_queue.push(SillyJob("short", "HIGH"));
        silly_queue.push(SillyJob("very very long description", "LOW"));

        while (!silly_queue.empty())
        {
            std::cout << silly_queue.top() << std::endl;
            silly_queue.pop();
        }
    }

    std::cout << std::string(60, '-') << "\nNot so silly: (by priority value)" << std::endl;
    {
        // by description length (member operator<)
        typedef bool (*cmpf)(const SillyJob&, const SillyJob&);
        typedef std::priority_queue<SillyJob, std::vector<SillyJob>, cmpf> not_so_silly_queue;

        not_so_silly_queue queue(by_priority);

        queue.push(SillyJob("short", "HIGH"));
        queue.push(SillyJob("very very long description", "LOW"));

        while (!queue.empty())
        {
            std::cout << queue.top() << std::endl;
            queue.pop();
        }
    }

}

PS。 by_priority比较函数是糟糕设计的一个很好的例子,但请记住它仅用于演示目的:)

答案 3 :(得分:0)

如果可以将类型的值相互比较,则可以使用任何类型作为优先级。