分层优先级索引
Hierarchical priority index
我正在寻找一个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
将包含指向填充顺序中的桶的指针。只需将第一个装满,然后用剩下的水装满下一个。
- 数组索引的值没有增加
- 芬威克树(BIT).找到具有给定累积频率的最小索引,单位为 O(logN)
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 查找最接近的大于当前数字的数字的索引
- 按对象的特定方法按升序排列的C++优先级队列
- 使用2个键的cpp-stl::优先级队列排序不正确
- 在C++中调整向量中的索引
- 重载元组索引运算符-C++
- 给定一个向量,如何找到该向量的所有子集和的原始索引
- 为std::string的某个索引赋值
- 并行用于C++17中数组索引范围内的循环
- 跟随整数索引列表的自定义类迭代器
- 如何在for循环中包含两个索引值的测试条件
- D3D11-将混合权重和索引传递到顶点着色器
- 为什么我需要C++中不同的排序格式来对这个USACO代码上的数组和优先级队列进行排序
- 将转换字符键入 int 以用作向量C++的索引
- 在 C++ 中访问数组负索引处的内存不会返回垃圾
- 打印优先级队列
- 分层优先级索引
- 根据索引和优先级排序列表的数量