В чем разница между SplHeap, SplMinHeap, SplMaxHeap и SplPriorityQueue

Есть несколько объектов, которые мне нужно пройти в отсортированном порядке. Обнаружены два подкласса 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);
// ...

Вопросы:

  1. Для SortedObjectHeap порядок выглядит точно так же, независимо от того, продлил ли я SplHeap, SplMaxHeap или же SplMinHeap, Я думал, что при переключении между Min и Max порядок изменится, но, похоже, этого не происходит … так в чем же разница между расширением этих 3 классов?

  2. Из документов, очевидная разница между SplHeap а также SplPriorityQueue является то, что очередь занимает дополнительную $priority параметр в insert метод. Таким образом, кажется, что с очередью вы должны сказать ей, что сортировать по каждой вставке, в то время как с кучей она «знает» это внутренне … Это различие или есть другие важные различия между этими двумя? Я предполагаю, что они могут работать по-другому внутри? Как выбрать между этими двумя?

0

Решение

Причина того, что SplMinHeap а также SplMaxHeap вернуть тот же порядок, что вы даете им обеим одну и ту же функцию сравнения. Но SplMinHeap :: Сравнить а также SplMaxHeap.Compare определяются по-разному.

SplMinHeap::Compare возвращает положительное целое число, если value1 < value2, SplMaxHeap::Compare возвращает положительное целое число, если value1 > value2,

Ты используешь SplMinHeap или же SplMaxHeap если вам нужна куча, упорядоченная по «естественному» порядку элемента. Как вы хотите создать упорядоченный список строк. Какой из них вы используете, зависит от того, хотите ли вы в порядке возрастания или убывания.

Ты используешь SplPriorityQueue если вы хотите связать приоритет с каждым элементом и иметь кучу, упорядоченную по приоритету. Например, у вас есть несколько имен, но вы хотите, чтобы они были расположены в том порядке, в котором они были вставлены в систему. Итак, Джо, Билли, Мэри и Алиса появились в таком порядке, вы бы дали Джо приоритет 1, Билли приоритет 2 и т. Д.

Но если все, что вам нужно, это отсортированный список строк, почему бы просто не отсортировать их и покончить с этим? Это будет быстрее, чем заполнять кучу и извлекать элементы по одному.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]