分层优先级索引

Hierarchical priority index

本文关键字:索引 优先级 分层      更新时间:2023-10-16

我正在寻找一个C++库,该库具有以下问题的索引解决方案。我试着制定自己的解决方案,但得出的结论是,我在这里发明了一个轮子。

我有装水的水桶。它需要在层次结构之间进行分水。我想,它也可以表示为具有优先级的队列。在优先级较高的水桶装满之前,其他水桶不会收到任何水。有些水桶有儿童水桶,他们应该把水递到那里。所有的孩子都可以有自己的孩子,所以他们也是一些孩子的母亲母亲水桶可以严格排队(一个接一个)或按比例分水。

在下面的一张照片上,我试图说明情况。我们将Bucket作为层次结构的顶部。它有3个孩子。他们按照优先顺序(1、2、3)严格取水。在铲斗1装满之前,铲斗2不会收到任何水。Bucket 1还有3个孩子。两个孩子的优先级相同,分别为50%和50%,第三个孩子只有在其他两个孩子吃饱后才能喝水。第一个孩子有了孩子,他们分了20%和80%的水。

任何级别上的整数1都具有最高优先级。如果桶在同一级别上有相似的整数,我们可以认为它们的优先级相等,然后查看拆分的比例。1号位于第一层的铲斗将首先接收水。然后,它必须将水输送到第二层,在第二层中,水将被分成50%-50%,然后50%将在最后一层之间被分成50%(20%-80%)。

                                             +--------------+
                                             |              |
                                             |   Bucket     |
                                             +-+-----+----+-+
                                               |     |    |
                                               |     |    |
                                      1        |     |    |       3
                              +----------------+     |    +-----------------+
                              |                      |                      |
                              |                      |2                     |
                              ^                      |                      ^
                           +------+                  |                   +--+--+
                           |  |   |                  ^                   |     |
                  1        |  |   |   2           +--+--+                +-----+
                  0.5      |  |   |               |     |
                +----------+  |1  +-------+       +-----+
                |             |0.5        |
                ^             ^           ^
             +--+--+      +---+---+     +-+---+
             |     |      |       |     |     |
             ++-+--+      +-------+     +-----+
              | |
     1 0.2    | |
   +----------+ |1 0.8
   |            |
   |            |
   v            v
+--+--+      +--+--+
|     |      |     |
+-----+      +-----+

我需要对所有孩子及其比例进行索引,这样,当我收到水时,我会根据所有优先级和共享权重来分配水。我的想法是使用double变量的整数部分的位来表示层次结构的每个级别上的优先级,并使用小数部分来存储比例。

您可以将问题从树表示转换为队列,方法是使用访问者遍历深度优先的树:

#include <map>
#include <list>
struct Bucket
{
    std::map<unsigned int, Bucket> children; // <priority, children>
    template<class Visitor>
    void visit(const Visitor& visitor)
    {
        for (auto it = children.rbegin(); it!= children.rend(); ++it)
        {
            visitor(&it->second);
            it->second.visit(visitor);
        }
    }
};
int main()
{
    Bucket root_bucket;
    // populate root_bucket
    // ...
    // index root_bucket
    std::list<Bucket*> indexed_buckets;
    root_bucket.visit( [&](Bucket* b){ indexed_buckets.push_back(b); });
}

演示

之后,indexed_buckets将包含指向填充顺序中的桶的指针。只需将第一个装满,然后用剩下的水装满下一个。