куча с ++ с удалением любого метода элемента - PullRequest
1 голос
/ 15 января 2012

Я пытаюсь реализовать свою собственную кучу с методом, удаляющим любое число (не только минимальное или максимальное), но я не могу решить одну проблему. Чтобы написать эту функцию удаления, мне нужны указатели на элементы в моей куче (чтобы иметь O (logn) время удаления данного элемента). Но когда я попытался сделать это так:

vector<int*> ptr(n);

это, конечно, не сработало.

Может быть, я должен вставить в свою кучу другой класс или структуру, содержащую int, но сейчас я хотел бы найти какое-либо решение с помощью int (потому что я уже реализовал его с помощью int)?

Ответы [ 2 ]

2 голосов
/ 15 января 2012

Когда вам нужно удалить (или изменить приоритет) другие объекты, кроме корня, d-куча не обязательно является идеальной структурой данных: узлы продолжают менять свое положение, и вам необходимо отслеживать различные перемещения. Это выполнимо, однако. Чтобы использовать такую ​​кучу, вы должны вернуть дескриптор вновь вставленного объекта, который идентифицирует некоторый тип узла, который остается на месте. Поскольку алгоритм d-heap опирается на идеально сбалансированное дерево, вам необходимо реализовать его с использованием массива. Поскольку эти два требования (использование массива и наличие узлов остаются на месте) являются взаимоисключающими, вам нужно выполнить оба этих требования и иметь индекс из узлов в массив (чтобы вы могли найти положение объекта в массиве) и указатель из массив для узла (так что вы можете обновить узел при изменении положения). Почти наверняка вы не хотите много перемещать свои узлы, то есть вы предпочитаете находить правильное направление для перемещения узлов путем поиска по нескольким узлам, то есть вы хотите использовать d> 2.

Существуют альтернативные подходы для реализации кучи, основанные на узлах. В частности, кучи Фибоначчи, которые дают для определенных моделей использования более высокую амортизированную сложность, чем обычная сложность O (ln (n)). Однако их несколько сложнее реализовать, и фактическая эффективность окупается только в том случае, если вам нужно либо часто менять приоритет узла, либо у вас достаточно большие наборы данных.

0 голосов
/ 15 января 2012

A heap - это особая структура данных;элементы хранятся в двоичном дереве, и существуют хорошо разработанные процедуры для добавления или удаления элементов.Многие реализации используют массив для хранения узлов дерева, а для удаления элемента требуется перемещение элементов log (n).Обычно при использовании массива дочерние узлы в расположении массива n хранятся в местоположениях 2n и 2n + 1 ;элемент 0 оставлен пустым.

Эта страница Википедии прекрасно объясняет алгоритмы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...