我刚刚陷入困境,而且我没有看到何时应该在最小堆上使用最大堆,因为它(至少对我而言)对于排序数组更加相关。但似乎它们几乎同样受欢迎?
什么时候在最小堆上设置最大堆更有用?
答案 0 :(得分:0)
例如,当您想要首先处理具有最低优先级编号的事物时,可以使用最小堆。如果要首先处理具有最高优先级编号的事物,请使用最大堆。
例如,在许多情况下,"优先级1"意味着它是最重要的事情。 "优先级2"在"优先级1"之后处理项目项目。您设置了一个最小堆,以便首先从堆中删除优先级较低的数字。
但在某些情况下,较大的数字决定了优先级。例如,您可能希望在处理10美元订单之前处理1000美元的订单。在这种情况下,您需要设置最大堆,以便首先处理价格较高的订单。
最大堆和最小堆之间的唯一区别是用于确定项的顺序的比较。一个使用"少于,"而另一个使用"大于。"
事实上,许多堆实现并不区分最小堆和最大堆。相反,它们允许您传递执行排序的比较功能。因此,如果您想从低到高订购,则比较会这样做:
int compareForward(int x, int y)
{
if (x < y) return -1;
if (x > y) return 1;
return 0;
}
如果你想从高到低订购,比较会这样做:
int compareReverse(int x, int y)
{
if (x < y) return 1;
if (x > y) return -11;
return 0;
}
例如,请参阅接受comparator
参数的Java PriorityQueue constructor。或者是C ++标准库std::priority_queue constructors,它还允许您传递比较函数。