У меня есть бинарная максимальная куча (наибольший элемент в верхней части), и мне нужно держать ее в постоянном размере (например, 20 элементов), избавляясь от самый маленький элемент каждый раз, когда я добираюсь до 20 элементов. Бинарная куча хранится в массиве с дочерними узлами i при 2 * i и 2 * i + 1 (i на основе нуля). В любой момент куча имеет элементы «n_elements», между 0 и 20. Например, массив [16,14,10,8,7,9,3,2,4] будет действительной максимальной бинарной кучей, с 16, имеющих детей 14 и 10, 14, имеющих детей 8 и 7 ...Поиск наименьшего элемента двоичной максимальной кучи, хранящейся в массиве Ahnentafel
Чтобы найти наименьший элемент, кажется, что в общем случае мне нужно пересечь массив из n_elements/2 в n_elements: наименьший элемент не обязательно последний в массиве.
Итак, с помощью всего этого массива кажется, что любая попытка найти/удалить наименьший elt не менее O (n). Это верно?
Что мы должны сделать после удаления самого маленького элемента, чтобы найти новый? – MBo
@ MBo Хорошая точка, я думаю, единственный вариант - сохранить отдельную мини-кучу? –
Существует структура данных кучи minmax: http://en.wikipedia.org/wiki/Min-max_heap.Конечно, это код довольно сложный, но с двумя отдельными кучами мы должны использовать много дополнительного пространства (для второй кучи, для поддержания сопоставления один к одному) и выполнять работу дважды. Я думаю, выбор зависит от размера реальной проблемы. – MBo