Есть несколько объектов, которые мне нужно пройти в отсортированном порядке. Обнаружены два подкласса 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 порядок изменится, но, похоже, этого не происходит … так в чем же разница между расширением этих 3 классов?
Из документов, очевидная разница между SplHeap
а также SplPriorityQueue
является то, что очередь занимает дополнительную $priority
параметр в insert
метод. Таким образом, кажется, что с очередью вы должны сказать ей, что сортировать по каждой вставке, в то время как с кучей она «знает» это внутренне … Это различие или есть другие важные различия между этими двумя? Я предполагаю, что они могут работать по-другому внутри? Как выбрать между этими двумя?
Причина того, что SplMinHeap
а также SplMaxHeap
вернуть тот же порядок, что вы даете им обеим одну и ту же функцию сравнения. Но SplMinHeap :: Сравнить а также SplMaxHeap.Compare определяются по-разному.
SplMinHeap::Compare
возвращает положительное целое число, если value1 < value2
, SplMaxHeap::Compare
возвращает положительное целое число, если value1 > value2
,
Ты используешь SplMinHeap
или же SplMaxHeap
если вам нужна куча, упорядоченная по «естественному» порядку элемента. Как вы хотите создать упорядоченный список строк. Какой из них вы используете, зависит от того, хотите ли вы в порядке возрастания или убывания.
Ты используешь SplPriorityQueue
если вы хотите связать приоритет с каждым элементом и иметь кучу, упорядоченную по приоритету. Например, у вас есть несколько имен, но вы хотите, чтобы они были расположены в том порядке, в котором они были вставлены в систему. Итак, Джо, Билли, Мэри и Алиса появились в таком порядке, вы бы дали Джо приоритет 1, Билли приоритет 2 и т. Д.
Но если все, что вам нужно, это отсортированный список строк, почему бы просто не отсортировать их и покончить с этим? Это будет быстрее, чем заполнять кучу и извлекать элементы по одному.
Других решений пока нет …