Иконка ресурса

Реализация проводов

GreedyCat добавил(а) новый ресурс:

Реализация проводов - Попытка объяснить то, как можно реализовать провода и сеть энергии

Приветствую! Я тут недавно закончил делать провода и теперь хочу поделиться с Вами тем, что у меня получилось. Не просто расскажу, а попытаюсь объяснить, как это работает.

Итак, давайте порассуждаем. Каким образом можно реализовать провода?

Иметь для каждого провода тайл и каждую секунду передавать енергию?

Не… Начнется лютый лагодром и каким образом понять куда доставлять енергию.

Лучше с помощью алгоритма поиска в ширину(Почему он? Он проходится по всем вершинам графа, то есть он...

Узнать больше об этом ресурсе...
 
Главное, что понял, как работает
Нет, видимо ты не понял
Начнется лютый лагодром
В наполовину твоей реализации как раз лагодром и начнется:
1548548207007.png
Зачем здесь аррей листы?
Я же не случайно создавал в вместо них хеш сеты.

Дело в том что при вызове contains, аррей лист начинает сканировать с первого элемента до последнего, сравнивая каждый с аргументом через equals. А в тоже время HashSet при вызове contains получает из аргумента хешкод, и по нему из хештаблицы достает элемент.
Таким образом получаем что скорость проверки на элемент у хешсета константная(почти), а у аррей листа нет, и очень существенно увеличивается при больших размеров листа.

Речь идет не о каких-то долях процентов, с использованием аррей листов скорость падает в разы, если не в десятки и сотни раз.
 
3,005
192
592
Только я предпочитаю без пересчета собирать сразу систему, которая будет автоматически собираться при постановке/удаление блока?
(Просто получить уже готовую сеть и добавить туда элементы, либо же добавить туда другую сеть)
 
Нет, видимо ты не понял

В наполовину твоей реализации как раз лагодром и начнется:
Посмотреть вложение 4413
Зачем здесь аррей листы?
Я же не случайно создавал в вместо них хеш сеты.

Дело в том что при вызове contains, аррей лист начинает сканировать с первого элемента до последнего, сравнивая каждый с аргументом через equals. А в тоже время HashSet при вызове contains получает из аргумента хешкод, и по нему из хештаблицы достает элемент.
Таким образом получаем что скорость проверки на элемент у хешсета константная(почти), а у аррей листа нет, и очень существенно увеличивается при больших размеров листа.

Речь идет не о каких-то долях процентов, с использованием аррей листов скорость падает в разы, если не в десятки и сотни раз.
Понял, принял, поправим. Я так сделал т.к. в этой теме dahaka сказал, что для проверенных блоков Set - дорого. Видимо его не стоило слушать.
 
Последнее редактирование:
2,505
81
397
Set для блоков, которые нужно проверить - дорого. Лучше ArrayList.
Вот только не надо на меня нагонять.

Если сначала проверить по сету, что очередного блока нет в пройденных, то для блоков, которые нужно проверить, достаточно списка.
 
2,505
81
397
Для генераторов и хранилищ тоже достаточно списка, если изначально проверить, что блока нет в сете пройденных.

Не нужно никаких очередей. ArrayList самый легковесный и позволяет делать тоже самое.
 
Можно вообще обойтись стандартными примитивными массивами, знаешь ли. Аррейдеквеер намного удобнее голого листа, и я не думаю что он что-то там нагружает
 
2,505
81
397
Там где не нужно увеличивать сайз, лучше обойтись стандартными примитивными массивами, знаешь ли.
ArrayDeque еще нормально. Я думал, ты именно про связные списки на нодах.
 
Последнее редактирование:
Для проверенных блоков поставил HashSet. Для хранилищ и генераторов наверное можно оставить ArrayList, все равно придется итерировать через весь массив.
 
Сверху