Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Операция pop на месте для двоичной кучи на основе массива?

Автор вопроса: user541686Ответов: 1

У меня есть двоичная куча на основе массива, используемая для поиска по графу (хотя цель не имеет значения).
(Элемент с индексом 0 является вершиной кучи.)

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

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

  • Почему вы хотите оставить этот предмет там? В любом случае вам понадобится шаг исправления (какой из других элементов станет новой вершиной? И какой из них займет место новой вершины? и т. д.), поэтому единственное, что вы действительно сэкономите, это... копирование нескольких элементов (которые должны быть за дешевизной) и, возможно, некоторое изменение размера массива. 14.07.2014
  • @delnan: с теоретической точки зрения это бесполезно. С практической точки зрения я делаю это на C++, и отказ от перемещения объектов в отдельный массив помогает снизить требования к типу объекта пользователя. В любом случае, причина не имеет значения, так что не беспокойтесь об этом. Я специально пытаюсь получить ответ на этот конкретный вопрос, а не на что-то другое. Если это невозможно, то это правильный ответ для меня. user541686 14.07.2014

algorithmdata-structuresheapin-placebinary-heap

Ответы

Ответ 1 · Chris Dodd

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы