2010-10-18 2 views
17

На поиски, чтобы расширить мое мастерство программирования, я так часто вникал в The Standard PHP Library. Это привело к моему открытию класса SplDoublyLinkedList. Оттуда я прочитал описания Linked Lists и Doubly Linked Lists в Википедии.В чем смысл класса PHP SplDoublyLinkedList и, что более важно, Linked Lists в целом?

Я понимаю, как они работают ... Но я не могу представить себе причину, ПОЧЕМУ мы нуждаемся в этом — или еще еще пример практического примера SplDoublyLinkedList, так как у нас есть индексированные и ассоциативные массивы в PHP.

Как связаны списки, обычно используемые в PHP и PHP?

ответ

6

Структуры данных SPL уменьшают потребление памяти и улучшают производительность. Хорошие пояснения:

Структуры данных по своей природе не зависят от языка и существуют как набор логических концепций, основанных на математике. Эти контейнеры используют разные алгоритмы, чтобы повысить эффективность.

Например, если вам не нужны возможности хэш-карты ассоциативного массива - то есть, если вы не используете ключ массива для определенной цели и нужен только нулевой массив - SplFixedArray (ранее SplFastArray, в настоящее время недокументированный) может быть подходящей заменой. Единственное предостережение заключается в том, что размер массива фиксирован, что означает, что вы должны указывать размер при создании экземпляра класса, и ошибка будет возникать, если вы попытаетесь сохранить больше, чем это число элементов. По этой причине, в среднем, он работает лучше, чем стандартные массивы PHP.

http://web.archive.org/web/20130805120049/http://blueparabola.com/blog/spl-deserves-some-reiteration

В коде C, что составляет интерпретатор PHP, массивы реализуются как структура данных называется хэш-таблицы или хэш-карта. Когда значение, содержащееся в массиве, ссылается на его индекс, PHP использует хеширующую функцию для преобразования этого индекса в уникальный хеш, представляющий местоположение соответствующего значения в массиве.

Эта реализация хэш-карты позволяет массивам хранить произвольное количество элементов и обеспечивать доступ ко всем этим элементам одновременно, используя либо числовые, либо строковые ключи. Массивы чрезвычайно быстрые для возможностей, которые они предоставляют, и являются отличной структурой данных общего назначения.

В информатике список определяется как упорядоченный набор значений. Связанный список - это структура данных, в которой каждый элемент в списке включает ссылку на один или оба элемента по обе стороны от него в списке. Термин «дважды связанный список» используется для обозначения последнего случая. В SPL это принимает форму класса SplDoublyLinkedList .... Имеет смысл использовать списки, когда количество элементов, которые должны быть сохранены, заранее неизвестно, и к элементам нужно только получить доступ к последовательному положению.

http://matthewturland.com/2010/05/20/new-spl-features-in-php-5-3/

+0

Это лучший ответ здесь, и хороший, чтобы понять цель этих структур данных. Однако все не так просто, как предполагает этот ответ. Основываясь на концепции того, что представляет собой двойной связанный список и какая хэш-таблица (как массивы реализованы в PHP), можно было бы ожидать, что двойной связанный список может сэкономить много памяти по массиву. Однако при тестировании у меня тоже не хватает памяти. Это заставляет меня думать, что дважды связанные списки реализованы очень глупо в PHP. –

+1

Я также попытался создать свой собственный класс связанных групп с острым взглядом на сохранение памяти. Как-то у меня заканчивается память примерно в том же месте, как если бы я использовал обычный PHP-массив, что очень странно. Это заставляет меня подозревать, что внутри PHP использует PHP-массивы в неожиданных местах. Это просто догадка, но не уверен, что еще думать. BTW Я использую PHP 5.3.2, поэтому, надеюсь, более новые версии лучше об этом, но я не знаю. Дело в том, что если вы собираетесь использовать структуру данных, отличную от массива PHP, для повышения производительности, убедитесь, что вы измеряете производительность, чтобы убедиться, что она помогает. –

3

Согласно К Wikipedia,

Основное преимущество связанного списка по сравнению с обычным массивом является то, что порядок связанных элементов может быть отличается от того, что данные элементы хранящегося в памяти или на диске. По этой причине связанные списки позволяют вставлять и удалять узлы в любом точке в списке с постоянным количеством операций.

С другой стороны, связанные списки по сами не позволяют произвольного доступа к данным, или любой другой формы эффективного индексации. Таким образом, многие основные операции - такие, как получение последнего узла списка, или найти узел, который содержит заданную точку привязки, или местонахождение места, где новый узел должен быть вставленными - может потребовать сканирование наиболее из элементов списка.

Чтобы ответить на ваш вопрос, я понятия не имею. :)

+0

HAha! Да, я тоже это прочитал. +1 для «Я понятия не имею. :)» – Stephen

+0

+1: идея не является хорошей идеей. – tacone

+1

. Это говорит о том, что связанная длительность имеет быструю вставку и удаление, тогда как в обычном массиве элементы нужно перетасовывать или массив должен быть скопирован и расширен.Однако «массив» PHP «*» не является обычным массивом. – mpen

0

Они там, потому что для них используются многие программисты, работающие с другими языками, где массивы имеют фиксированные размеры, и вам нужно позаботиться о управлении памятью.
Итак, для PHP это еще один инструмент. Они реализованы потому, что многие алгоритмы & шаблона ретранслируют по спискам и поэтому их не нужно менять на php-массивы.

+1

Это основано на предположении? Кажется, что в SPL будет реализована ненужная структура данных, которая существует только для того, чтобы успокоить программистов, переходящих на PHP с другого языка ... – Stephen

+0

Они реализованы в SPL, поскольку пользовательские PHP-письменные реализации гораздо менее эффективны. Сообщество php могло жить без них годами. И списки уверены, что одна из наиболее важных структур данных используется. То же самое относится и к классам - вам не нужно писать программы, но они действительно помогают, но они тоже являются инструментом. – Fge

+1

Хорошо, я буду кусать. Они не нужны (очевидно, потому что я так долго без них), но есть ли у вас пример того, как они могут облегчить мою жизнь? Вы сравнили их с классами. Занятия делают мою жизнь примерно в девять миллиардов раз легче. Как и где связанный список подходит для PHP? – Stephen

0

Как уже упоминалось, списки являются альтернативой фиксированных массивов, которые являются общими в других языках. Но один важный аспект, который часто упускается из виду - вы можете очень эффективно вставлять или удалять элемент из любого места в списке.

Зачем это важно? Допустим, у вас есть несколько элементов, которые вы хотите сохранить в массиве, возможно, поэтому вам не нужно сортировать их позже или просто для минимизации времени поиска. В этом случае List может быть очень мощным инструментом. Особенно для очень больших наборов данных.

3

В первую очередь, SplDoublyLinkedList являются объектами, в качестве такого

  • они могут быть расширены, так что вы можете изменить свои методы (вы можете, например, вернуть все строки в верхнем регистре, и т.д.)
  • интерфейсы они могут быть проверены, как в myfunc(SplDoublyLinkedList $var) ...
  • они переданы как ссылка по умолчанию
  • и т. д.

Во-вторых, SplDoublyLinkedList принимают режимы итерации, так что вы удалить ваши детали на ходу, и направление переключателя без переназначения массива или усложнять код:

SplDoublyLinkedList :: IT_MODE_LIFO (Стек стиль)

SplDoublyLinkedList :: IT_MODE_FIFO (Queue стиль) поведение итератора (либо один или другой)

SplDoublyLinkedList :: IT_MODE_DELETE (элементы удаляются с помощью итератора)

SplDoublyLinkedList :: IT_MODE_KEEP (Элементы, проходимый итератора)

выше цитата от http://simpletechinfo.com/SplDoublyLinkedList, который содержит некоторые образцы кода.

Есть другие льготы (например, Еогеасп не имея делать копию в памяти всех данных и т.д.)

0

Вы, вероятно, правы, и это просто не очень полезно.

Существует много видов использования связанных списков в теории (в частности, танцевальные ссылки). Но большинство из них связано с хранением и клонированием своих итераторов в другом месте, доступом к содержимому более чем в двух направлениях или разделением и объединением списков. У SplDoublyLinkedList, похоже, не было таких.

Если это не для алгоритмов, одно из них - позволить объекту удалять ссылку на себя в каком-либо списке за постоянное время, освобождая его память и не перетасовывая список (путем хэширования или замены с помощью последнего элемента) после вставки или удаление. Но для этого требуется хранить итератор списка в этих объектах.

Без этих функций они просто ведут себя как два уважения. Если вам нужен только доступ к элементам с помощью итератора, они похожи на два стека. Один из лучших способов в однопоточных простых случаях, запрещающий уже не завернутый в класс, - это просто использовать два стека (возможно, фиксированные массивы или оба конца одного и того же массива). Поп из одного стека и нажимайте его на другой, когда хотите, чтобы итератор перемещался, а верхняя часть одного стека - это текущий элемент. Если вам также нужно получить доступ к голове и хвосту, вам нужно будет заменить стеки на deques.

Но если вы хотите самим реализовать стеки или deques, не зная максимальный размер или даже назначать узлы нормальных связанных списков (на языке без таких библиотек, как в PHP), хороший способ - связать некоторые фиксированные массивы вместе, используя двусвязные списки без этих функций. Как-то вам все еще нужно.

Документация PHP сама по себе, как и Java, предполагает, что они должны быть просто декой, поддерживающей некоторые дополнительные странные функции, а не даже два уровня (я думаю). Не используйте их, если вам действительно нужны дважды связанные списки.