我需要按排序顺序完成一堆对象。发现了SplHeap,SplMaxHeap和SplMinHeap这两个子类,因此我可以尝试将它们用作实验。在评论中,我还阅读了SplPriorityQueue mentioned。
然而,在尝试之后,我有点不确定这三个堆之间的区别是什么,以及如何在堆和队列之间进行选择。
以下是“4”类,它们都将按名称对对象进行排序,即foreach
循环将按正确排序的顺序列出对象,从头到尾:
class SortedObjectHeap extends SplHeap|SplMinHeap|SplMaxHeap
{
protected $_property;
public function __construct(string $property)
{
$this->_property = $property;
}
protected function compare($x, $y)
{
$x = $x->{$this->_property} ?? null;
$y = $y->{$this->_property} ?? null;
return strnatcasecmp($x, $y) * -1;
}
}
$list = new SortedObjectHeap('name');
$list->insert($object);
// ...
class SortedObjectQueue extends SplPriorityQueue
{
public function compare($x, $y)
{
return strnatcasecmp($x, $y) * -1;
}
}
$list = new SortedObjectQueue();
$list->insert($object, $object->name);
// ...
问题:
对于SortedObjectHeap
,订单看起来完全相同,无论我是SplHeap
,SplMaxHeap
还是SplMinHeap
。我认为在Min和Max之间切换时顺序会反转,但这似乎不会发生......所以扩展这3个类之间的区别是什么?
从文档中,SplHeap
和SplPriorityQueue
之间的明显区别是队列在$priority
方法中需要额外的insert
参数。因此,似乎在队列中你必须告诉它在每个插入时要排序的是什么,而在堆中它“内部”知道这个......这是不同的,还是这两者之间还有其他重要的区别?我猜他们内心的工作可能不同?如何在这两者之间做出选择?
答案 0 :(得分:2)
SplMinHeap
和SplMaxHeap
返回相同顺序的原因是您为它们提供了相同的比较功能。但SplMinHeap::Compare和SplMaxHeap.Compare的定义不同。
SplMinHeap::Compare
如果value1 < value2
则返回正整数,SplMaxHeap::Compare
如果value1 > value2
则返回正整数。
如果你想要一个按照项目&#34; s&#34;自然&#34;排序的堆,你可以使用SplMinHeap
或SplMaxHeap
。排序。就像你想要创建一个有序的字符串列表。你使用哪一个取决于你是否想要按升序或降序排列。
如果要将优先级与每个项目关联,并按优先级排序堆,则使用SplPriorityQueue
。例如,您有一堆名称,但您希望它们按照插入系统的顺序排列。所以乔,比利,玛丽和爱丽丝按照这个顺序出现,你给乔优先1,比利优先2等等。
但是,如果你想要的只是一个排序的字符串列表,为什么不对它们进行排序并完成它呢?这比填充堆和一次提取一个项更快。