Комментарии 38
То есть безусловно новое решение наверняка полезно, но ответ был на комментарий «теперь хоть какие-то есть».
А так, например, стэки широко используются при анализе или обработке вложенных структур данных, в частности при вычислении математических выражений. Очереди при обработке списков «заданий», скажем сначала парсим текстовый ввод в виде какого-то списка на отдельные элементы, нормализуя его в одном цикле, а потом обрабатываем нормализованный список в другом.
Собственно какие-то особенные проблемы эти типы данных не решают, но бывает решаешь задачу и смотришь «о-па, стандартный тип, можно велосипед не изобретать, он уже есть в „ядре“» или даже «блин, писал-писал, а стандартный тип получился, надо нафиг удалять, чтобы не позориться». Типа паттернов, но чисто для данных. Упрощают не сколько написание кода, сколько его понимание другими (или собой через некоторое время :). Естественно при целевом использовании.
Автор, ты не мог бы перефразировать это как-то более по-русски?
Заранее спасибо.
Мне более интересно как это использовать. Вот, скажем, есть список продуктов и список их модификаций, в связанном списке (с ценой, названием и т.п.). Как ускорить сортировку, получая это дело в связанный список, как сделать аналог array_multisort(). Скажем 2000 продуктов. 20 тыщ. цен. А хостинг слабый (rssites, masterhost) — как ускорить этим делом.
Извините, приземлен к своим задачам…
ПС. Лезу (за деньги) 16-й год. Зачем? Чтобы выжить.
В случае со списком продуктов и сортировкой связные списки ничего не дадут. Они эффективны тогда, когда нам нужен последовательный доступ к данным, то есть когда порядок обхода такой же, как при записи. В случае же, когда нужен случайный доступ к данным, в частности при сортировке, связные списки будут плохо работать. А сортировку в вашем случае лучше осуществлять на уровне запросов к БД, так как вряд ли там она будет выполняться медленней, чем если вы будете это делать в коде.
Зачем заниматься сексом, если не знать что выделяет элементарные гормоны и как они влияют на организм?
Примеров на данную тему в общем то масса.
Еще хорошо бы протестировать и сравнить потребление памяти array и специализированными структурами — это зачастую даже важнее прироста производительности.
Насчет использования — очереди собственно для очередей чего угодно: сообщения, задачи… ну многие другие ситуации часто являются подмножествами. FixedArray — очевидно для того, чтобы знать о размере занимаемой памяти. Хранилище объектов удобная штука когда нужно хранить набор объектов определенного типа + оно реализует ряд интерфейсов типа итератор, array access и других, что тоже полезно.
Это же хорошие и удобные штуки, да еще и в ООП стиле.
Статья оформлена по принципу
— берём раздел мануала
— смотрим в википедии незнакомые слова или слова которые автор думает будут незнакомы среднему хабраюзеру, копипастим описание
— если в мануале есть описание, берём его тоже
— добавляем слова «РАССМОТРИМ ПРИМЕР» или «НАПРИМЕР»
— копипастим пример из мануала
— добавляем слова «На этом мы закончили изучать структуры данных SPL.»
Мне кажется, было бы гораздо больше пользы, если бы автор внёс всё это в русскую документацию по php, а здесь просто отставил ссылку. И ему карма и рейтинг, и польза какая-никакая.
было бы не плохо, если автор действительно прислушиется Вашего совета и внесет свой вклад в развитие рускоязычного мана.
Даже если согласно сигнатуре функции массив должен быть передан по значению, на самом деле он передается по ссылке и только при попытке внести в него изменения будет на лету скопирован (copy on write). Поэтому не вижу, чем использование SplFixedArray будет оптимальнее.
echo $stack->serialize();
не выполнится, если версия PHP 5 < 5.4.0. И что интересно, там был баг с неправильной сериализацией, который закрыли в день написания этого топика :)Кучи являются древовидными структурами: каждый узел больше или равен своим потомкам, при этом для сравнения используется внедренный метод сравнения, который является общим для всей кучи. SplHeap реализует основную функциональность кучи и является абстрактным классом.
Ну так продемонстрируйте пожалуйста, как в узел SplMinHeap или SplMaxHeap можно сохранить несколько потомков. К сожалению, на самом деле это никакая не куча, а всего лишь связный список с сортировкой при вставке/удалении.
Кстати проверил:
1) обход через итератор идентичен извлечению через extract, т.е. от кучи ничего не остаётся
2) пересортировка при удалении реально есть. То есть создали кучу из объектов, один объект изменили при переборе он окажется на нужном месте:
<?php
$heap = new SplMaxHeap();
foreach ([16, 7, 11, 8] as $val){
$item = (object)['foo' => $val];
$heap->insert($item);
}
$obj = (object)['foo' => 6];
$heap->insert($obj);
foreach ([10, 15, 5] as $val){
$item = (object)['foo' => $val];
$heap->insert($item);
}
$obj->foo = 9; // меняем объект который уже в куче
foreach($heap as $element){
echo $element->foo." \n";
}
echo "count=".$heap->count();
16 15 11 10 9 8 7 5 count=0
Standard PHP Library (SPL) — Часть 1: Структуры данных