У меня есть куча объектов, которые мне нужно пройти в отсортированном порядке. Обнаружены два подкласса SplHeap, SplMaxHeap и SplMinHeap, поэтому я решил использовать их в качестве эксперимента. В комментарии я также прочитал SplPriorityQueue упоминается.
Однако, попробовав их, я немного не уверен, в чем именно разница между тремя кучами и как выбирать между кучами и очередью.
Вот «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 порядок изменится на противоположный, но, похоже, этого не происходит... так в чем же на самом деле разница между расширением этих трех классов?Из документов очевидная разница между
SplHeap
иSplPriorityQueue
заключается в том, что очередь принимает дополнительный параметр$priority
в методеinsert
. Итак, кажется, что с очередью вы должны сказать ей, что сортировать при каждой вставке, в то время как с кучей она «знает» это внутренне ... В этом разница или есть другие важные различия между этими двумя? Я предполагаю, что они могут работать по-разному внутри? Как выбрать между этими двумя?