【发布时间】:2019-04-25 20:47:59
【问题描述】:
我知道有一些类似的问题,但遗憾的是没有一个真正符合我的问题......所以我应该创建一个优先队列作为堆。我们得到了一些可以使用的代码 sn-ps(相当伪代码),但是如果我打印树,我将不会得到正确的数字。
我目前只是尝试将随机数插入队列并打印出来。队列元素是一个名为 Queue_elem 的自定义类。这是我的插入函数:
void Queue::insert(Queue_elem item){
this->container[number_elements] = item;
if (this->number_elements > 0) this->upHeap();
this->number_elements++;
}
number_elements 是数组(容器)大小的计数器。这是我的 upHeap:
void Queue::upHeap(){
for (int i = this->number_elements; i>=0; i = (i-1)/2) {
int parent = (i-1)/2;
if (this->container[i].getPriority() < this->container[parent].getPriority()) {
swap(this->container[i], this->container[parent]);
}
break;
}
}
就是这样。在我的主要内容中,我正在插入随机值并尝试像这样打印它们:
Queue que(11);
mt19937 rng;
rng.seed(random_device()());
uniform_int_distribution<std::mt19937::result_type> dist6(1,50);
for (int i = 0; i < 10; ++i) {
Queue_elem tmp(dist6(rng));
que.insert(tmp);
}
cout << que.container[0].getPriority() << endl;
for (int i = 0; i < 5;i++) {
cout << que.container[(2*i)+1].getPriority() << endl;
cout << que.container[(2*i)+2].getPriority() << endl;
}
所以我一个一个地遍历树,以正确的顺序打印数组,但总是错误的......
如有必要,我还可以提供整个项目。提前致谢。
编辑:Queue_elem
class Queue_elem {
public:
Queue_elem();
Queue_elem(int prio);
virtual ~Queue_elem();
int getPriority();
void setPriority(int prio);
int getId();
private:
int id;
int priority;
};
编辑2:输出是这样的:
1
18
29
26
37
30
44
46
48
49
0
【问题讨论】:
-
你为什么不使用 std::priority_queue?
-
你能发布
Queue_elem定义类吗? -
在你的 upHeap 中你有无条件的休息。好像应该在其他里面。 (如果 current_priority
-
@Blade 这里的“不正确”是什么意思?听起来您希望循环按排序顺序为您提供所有十个数字。此结构在队列的开头为您提供正确的值。取而代之的是队列的头部,打印,删除,重复
-
@janm 好的,所以我画了二叉树,确实在一个较低的数字之前有一个较高的数字,因为它就在它的父节点旁边。所以堆条件仍然满足。现在一切似乎都很好,谢谢!
标签: c++ binary-tree heap priority-queue