我正在寻找一个C ++库,它有以下问题的索引解决方案。我试图制定自己的解决方案,但得出的结论是我在这里发明了一个轮子。
我有接收水的源桶。它需要在层次结构之间分水。我想,它也可以表示为具有优先级的队列。在具有较高优先级的桶已满之前,其他桶不会接收任何水。有些水桶有儿童水桶,他们会在那里通水。所有的孩子都可以生孩子,所以他们也是一些孩子的母亲。 母水桶可以严格排队(一个接一个)或按比例分配水。
在下面的图片中,我试图说明情况。我们将 Bucket 作为hierra的顶级。它有 3个孩子 。他们根据他们的优先顺序(1,2,3)严格按顺序接收水。在铲斗1装满之前,铲斗2将不会接收任何水。 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
变量的整数部分位来表示层次结构的每个级别的优先级,使用小数部分来存储比例。
答案 0 :(得分:1)
您可以通过遍历深度优先树与访问者将您的问题从树表示转换为队列:
#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
将包含指向填充顺序中的存储桶的指针。只需填充第一个,直到它充满,然后用剩余的水填充下一个。