Комментарии 16
Я так и не понял почему не стек? Это классическое решение для такой задачи, насколько я знаю.
Ответила ниже, но продублирую - Deque использовала потому, что Stack является устаревшим по спеке.
ArrayList реализует структуру на которой можно сделать стек (структуру данных)
Можно, но зачем? Если имеется готовый java.util.ArrayDeque
?
Потому, что ArrayList для этой задачи достаточно, он быстрее и лучше по памяти. Это только алгоритмические параметру у них одинаковые.
Преждевременная оптимизация - корень всех бед. Доказательства будут?
Обе структуры имеют больше методов чем нужно для стека. То есть нет идеального совпадения по API. Очевидного кандидата я не вижу.
Алгоритмический стек часто реалтзуют через Array. ArrayList внутренне устроих очень близко к Array.
По производительности логика такая, что в ArrayList удаление последнего элемента будет очень быстрым так как это замена одного элемента в памяти. Вставка в основном такая же, но иногда надо сделать ресайз. Это настолько частые операции, что они оптимизированны на разных уровнях, в том числе и на железе.
Что внутри ArrayDeque нагуглить с наскока не удалось, но там явно есть двунаправленные ссылочки. А значит их надо добавлять, удалять. Работа не с единым кусом пямяти, а с разными это уже будет медленее. Хотя в рамках этой задачи она может быть и ниже погрешности измерений.
Ну и косвенные наблюдения, если бы ArrayDeck был быстрее Array на стековых задачах, то его бы чаще использовали. А так я редко вижу его вне алгоритмических задач.
Преждевременной оптимизацией это будет, если вы меня убедите, что код с использованием ArrayList будет сложнее.
Понятно. Теоретик. Судя по статьям в профиле, Вы питонист.
Что внутри ArrayDeque нагуглить с наскока не удалось
А зачем гуглить, если исходники классов стандартной библиотеки идут в комплекте с jdk? Но даже если jdk нет, то простой запрос четвёртой ссылкой выдаёт исходник на гитхабе. В котором мы видим, что внутри ArrayDeque, ВНЕЗАПНО, всё тот же массив.
А так я редко вижу его вне алгоритмических задач.
Потому что если спросить среднестатистического разработчика про фреймворк java-коллекций, то крайне редко вспоминают про очереди, прескорбно очень сие, но факт. Поэтому и не видно, потому что тупо не знают.
Понятно. Теоретик. Судя по статьям в профиле, Вы питонист.
Питон это любовь, а так много на чем проходилось код писать, в том числе на на Джаве.
Но даже если jdk нет, то простой запрос четвёртой ссылкой выдаёт исходник на гитхабе.
Ваш поисковик выиграл у моего.
В котором мы видим, что внутри ArrayDeque, ВНЕЗАПНО, всё тот же массив.
Тогда да, по скорости так-же будет. Вы правы.
Забавно, что в плане сравнения производительности в документации нет ArryList, а сравнивают c синхронизированной коллекцией.
Потому что если спросить среднестатистического разработчика про
фреймворк java-коллекций, то крайне редко вспоминают про очереди,
прескорбно очень сие, но факт. Поэтому и не видно, потому что тупо не
знают.
Я со структурами знаком и стараюсь проверять есть ли подходящяя в библиотеке языка которым я пользуюсь, но вот струкрура Deque у меня со стеком не ассоциируется никак.
Кстати это один из аргументов за использование ArrayList, потому, что все его знают.
Потому что стэк - это LIFO-очередь, чем, собственно, Deque и является.
Потому что в java.util.Stack присутствует ненужная в данном случае синхронизация, что сказывается на производительности.
Разбор неплохой, но в данной задаче у класса Deque используются только те методы, которые есть у класса Stack. Получается, решается она не только через двунаправленную очередь, для решения подошёл бы и экземпляр стека, какого-то удобства одного относительно другого тут не видно. Интереснее было бы включить еще немного информации про различия и показать, когда лучше использовать Stack, а когда имплементацию Deque, раз уж на то пошло :)
Спасибо:)
Deque использовала потому, что Stack является устаревшим по спеке.
Именно так. Кроме того, неверно (неполно, по крайней мере) описано отличие Deque от Queue. Главное отличие (что отражено и в названии) - это возможность вставлять и брать элементы с обоих концов, а не то, что это и стек. Стек тут идёт до кучи, как подмножество функционала просто с общепринятыми для стека названиями методов.
Если рассматривать структуры данных в плане алгоритмов, то неплохо бы еще и добавить что-то про сложность.
Мне очень нравится формат использующийся в этом документе для Python.
https://wiki.python.org/moin/TimeComplexity
Не совсем корректный пример, как мне кажется.
Здесь оптимальнее было бы использовать не очереди, а простой проход по массиву с получением значения «с другой стороны» до первого нарушения условия.
Думаю, лучше бы зашел пример с организацией кэша.
Использование очередей (Queue/Deque) для решения алгоритмических задач на Java