SplHeap,SplMinHeap,SplMaxHeap和SplPriorityQueue

时间:2017-11-12 22:03:26

标签: php data-structures heap priority-queue spl

我需要按排序顺序完成一堆对象。发现了SplHeapSplMaxHeapSplMinHeap这两个子类,因此我可以尝试将它们用作实验。在评论中,我还阅读了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);
// ...

问题:

  1. 对于SortedObjectHeap,订单看起来完全相同,无论我是SplHeapSplMaxHeap还是SplMinHeap。我认为在Min和Max之间切换时顺序会反转,但这似乎不会发生......所以扩展这3个类之间的区别是什么?

  2. 从文档中,SplHeapSplPriorityQueue之间的明显区别是队列在$priority方法中需要额外的insert参数。因此,似乎在队列中你必须告诉它在每个插入时要排序的是什么,而在堆中它“内部”知道这个......这是不同的,还是这两者之间还有其他重要的区别?我猜他们内心的工作可能不同?如何在这两者之间做出选择?

1 个答案:

答案 0 :(得分:2)

SplMinHeapSplMaxHeap返回相同顺序的原因是您为它们提供了相同的比较功能。但SplMinHeap::CompareSplMaxHeap.Compare的定义不同。

SplMinHeap::Compare如果value1 < value2则返回正整数,SplMaxHeap::Compare如果value1 > value2则返回正整数。

如果你想要一个按照项目&#34; s&#34;自然&#34;排序的堆,你可以使用SplMinHeapSplMaxHeap。排序。就像你想要创建一个有序的字符串列表。你使用哪一个取决于你是否想要按升序或降序排列。

如果要将优先级与每个项目关联,并按优先级排序堆,则使用SplPriorityQueue。例如,您有一堆名称,但您希望它们按照插入系统的顺序排列。所以乔,比利,玛丽和爱丽丝按照这个顺序出现,你给乔优先1,比利优先2等等。

但是,如果你想要的只是一个排序的字符串列表,为什么不对它们进行排序并完成它呢?这比填充堆和一次提取一个项更快。