Алгоритм эффективного перемещения содержимого вектора

У меня есть вектор размерности 3, который будет постоянно менять значение, например, если я удалю содержимое позиции 0, я хочу переместить содержимое оставшихся ячеек в оставшиеся ячейки, чтобы начать с 0.

В настоящее время я делаю это таким образом (Java-код), но считаю, что это очень неэффективно.

aux = posy[1];
posy[0] = aux;
aux = posy[2];
posy[1] = aux;
posy[2] = 0;

Есть ли другой, более эффективный способ сделать это?

Я имею в виду, вот как это делается. Это всегда займет время O (n). Лучшее, что вы можете сделать, это использовать петлю.

Prashant 27.06.2018 05:58

Просто сохраните указатели на голову и хвост, и вам не нужно будет ничего вращать.

Jacob G. 27.06.2018 06:01

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

Ole V.V. 27.06.2018 06:33
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
33
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Никаких дополнительных переменных не требуется.

posy[0] = posy[1];
posy[1] = posy[2];
posy[2] = 0;

Чтобы двигаться в обратном направлении, вам нужно будет сделать это в обратном порядке.

Никакое другое улучшение невозможно.

Если бы у вас было много элементов (скажем, пять элементов), я бы порекомендовал вам изучить класс ArrayDeque. Это позволяет вставлять и удалять с обоих концов без смещения элементов. Вероятно, он реализован с указателем, указывающим на каждый конец как @Jacob G. в комментарии, предложенном сделать. Всего для трех элементов это можно считать излишним.

Другие вопросы по теме