![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
зачем отдельной, длину можно устанавливать, изменяя поле length.
|
|
|||||
|
Цитата:
На всякий случай: public class MyObjectPool { private static var _head:MyObject = null; public static function getObject():MyObject {// Берём с головы, если есть if (head == null) return new MyObject(); MyObject result = _head; _head = _head.next; return result; } public static function pushObject(MyObject object):void {// Кладём в голову object.next = _head; _head = object; } } Но тут есть ограничения: - надо чтобы поле next принадлежало оъектам, которые ложим в пул - соответственно next может использоваться только для покладания только в один пул в один момент времени, если кто-то будет пытатся построить связный список используя этот next для чего-то другого - после поклажи в пул всё посыпется - если не делать поле next, а делать отдельные ноды, например так ложить в пул: То вы проиграете в десятки раз пулу на массиве/векторе из-за выделений памяти под ноды и последующей их сборке GC Цитата:
Не, переалокация есть на изменение размера вектора, но она случается редко и _амортизированное_ время поклажи и снятия с конца всё равно O(1), как бы это странно не звучало. Не среднее статистическое! А гарантированное общее амортизированное. В середину же мы не лезем. Цитата:
По поводу удаления из неупорядоченного массива - да есть такая практика, применяется при случайной выборке элементов, чтобы они не повторялись, т.е. взяли случайный индекс, запомнили, дырку заткнули элементом с конца. Только не надо разводить бухгалтерию с отделным хранением длины, просто array.length-- и всё! У нас нет настоящих массивов, у нас есть 2 реализации списка: Array - реализованный неведомыми алгоритмами и Vector - это почти как List в C#. Они за вас лишний раз ничё без надобности не переалоцируют - не переживайте. Цитата:
Это когда случайный элемент выбираем - мы индекс указываем, а не элемент - там действительно O(1). Это _произвольный_ элемент _двусвязного_ списка удаляется за O(1), но для этого надо иметь ссылку на узел (или сам объект должен являться узлом), иначе придётся искать "чьего узла объект" перебором со всеми вытекающими. Последний раз редактировалось expl; 05.11.2013 в 01:36. |
|
|||||
|
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Цитата:
|
|
|||||
|
listener
|
1 ..Оператор квадратной скобки для доступа к Vector/Array достаточно медленный, а с использованием связного списка доставать элементы можно будет по ссылкам...
Vector в плане производительности пошустрее массива. Ну, не мега, но все же. Ссылка - это хорошо, но храниться она будет в свойстве объекта типа какой-нибудь PollRecord как я понимаю, а значит к ней тоже надо получать доступ - с помощью оператора "." (точка). Получается упремся в "." против "[ ]" вроде как. Проверьте. На векторе. 2. Опять же, не знаю, что лучше, но вариант со списком более логичен и универсален. Вариант с замещением удяляемого на хвост - частность, но если дело только в этом... пахнет второй волной рефракторинга, вобщем. |
|
|||||
|
Цитата:
В AS3 одно- и двусвязные- списки имеют смысл только если узлами являются сами хранимые объекты (соответственно один объект не может лежать в 2-х списках). Потому что выделение памяти и последующая сборка узлов очень много тратят ресурсов. Или надо делать пул узлов внутри списка (видел такие конструкции в одном проекте, может даже имели смысл) Да и сами связные списки не такие уж применимые как кажется на первый взгляд: - Тут удаление за O(1) из середины! - Отлично, давай удалим из list объект object - Ээ, а как узнать какому узлу принадлежит objet? Пройтись за O(n)? Но в чём тогда преимущества? - Ну можно запомнить узел в object при добавлении - но тогда ведь надо будет влезть в object, и нельзя будет добавлять их в 2 списка, зачем вооще эти списки придумали? - чтобы во время итерации вставлять после текущего узла быстро или удалять - где такое применяется? - на вскидку не вспомню Кстати, если нужно просто хранилище объектов неупорядоченное с O(1) вставкой и удалением - используйте Dictionary. Последний раз редактировалось expl; 05.11.2013 в 01:41. |
|
|||||
|
listener
|
Речь шла о сравнении самописного списка и вектора (массив в проигрыше) применительно к организации пула, когда нам нужно просто отдать объект с вершины/поместить его в вершину и все. Этим и следует ограничиться
. |
|
|||||
|
.
|
Односвязный список в качестве пула должно быть OK. Сложность чтения начального элемента для него O(1). По сути, вы и вектора и массивы для пула пользуете в виде unshift (или push) и shift (или pop).
|
|
|||||
|
Цитата:
Превращать вектор в итератор может и есть смысл, но как верно замечено: Цитата:
Ябпоглядел на удобный стек или очередь на основе списка.
__________________
Кто к нам с чем для чего - тот у нас того от того. |
|
|||||
|
[+1 25.10.13]
[+4 18.03.14] |
Мне тоже интересно чем стек от пула отличается?
![]() |
|
|||||
|
.
|
Может кто-то проведет тест?
Добавлено через 21 минуту Цитата:
Последний раз редактировалось dimarik; 06.11.2013 в 02:03. |
![]() |
![]() |
Часовой пояс GMT +4, время: 16:06. |
|
|
« Предыдущая тема | Следующая тема » |
|
|