Я пытаюсь реализовать двоичную кучу (приоритетную очередь), которая имеет возможности как минимальной, так и максимальной кучи. Он должен иметь методы insert(value)
, extractMin()
и extractMax()
. Методы извлечения удаляют значение из кучи и возвращают значение.
Первоначально я использовал два массива, называемых minHeap
и maxHeap
, один для хранения данных в структуре минимальной кучи, а другой для хранения тех же данных в структуре максимальной кучи. Поэтому, когда я вызываю extractMin()
, он удаляет и возвращает значение из minHeap
. Затем я также должен удалить это значение из maxHeap
(и наоборот, если я вызывал extractMax()
), чтобы сохранить идентичный набор данных в обеих кучах. И из-за свойства порядка кучи я гарантированно найду это значение в листьях другой кучи. Поиск этого значения в другой куче приводит к временной сложности O(n) или, точнее, O(n/2), поскольку я буду искать только листья. Не говоря уже о том, что методы percolatingDown()
и percolatingUp()
для восстановления кучи после удаления значений уже равны O(log n); так что в целом методы извлечения будут O (n). Проблема в том, что мне нужно, чтобы методы извлечения были O (log n).
Есть ли лучший способ сделать это?
Я тоже думал об этой идее, но сначала хотел узнать, что вы все думаете.
Я только что закончил кодировать «среднюю кучу», поместив меньшую половину данных в максимальную кучу, а большую половину в минимальную кучу. С помощью этой структуры я могу легко получить медиану заданного набора значений. И я думал об использовании аналогичной структуры размещения меньшей половины данных в минимальной куче и большей половине в максимальной куче и использовании среднего (а не медианы) всех значений в качестве решающего фактора того, является ли чтобы поместить значение в максимальную или минимальную кучу при вызове insert(value)
. Я думаю, что это может сработать, поскольку методы извлечения останутся O (log n).
extract
по-прежнему будутO(log n)
, поскольку это просто самый левый и самый правый узел дляextractMin()
иextractMax()
соответственно. - person M. Shaw   schedule 23.07.2015O(nlogn)
? - person Eric Z   schedule 23.07.2015O(logn) + O(n) = O(n)
? - person Eric Z   schedule 23.07.2015