Пересечение двух максимальных куч

У меня есть две максимальные кучи (представленные в массивах), H1 размера m и H2 размера n, с n>m. Я должен создать третью максимальную кучу с элементами, идущими от пересечения H1 и H2.

Элементарное решение (сканирование двух массивов) занимает время O(n*m) и не использует свойства max-heap.

Другие идеи?

2 ответа

Решение

Учитывая две кучи, вы можете вычислить пересечение элементов за O(M log M + N log N) времени, и результат упорядочен. Упорядоченный массив - это уже куча, поэтому больше времени не требуется.

Пример Python-синтаксиса:

# Given arrays heap1, heap2.

intersection = []
while len(heap1) > 0 and len(heap2) > 0:
    if heap1[0] == heap2[0]:
        # Common element, part of the intersection.
        intersection.append(heap1[0])
        heap.heappop(heap1)
        heap.heappop(heap2)
    elif heap1[0] > heap2[0]:
        heap.heappop(heap1)
    else:
        heap.heappop(heap2)

# intersection now contains the common elements of heap1 and heap2,
# in max-to-min order, so it already meets the heap invariant.

Если хеширование возможно, сделайте пересечение с установленным хешем, а затем сложите. Это O(n) с обычными оговорками.

Если хеширование невозможно, сделайте пересечение с деревом, установленным на H1 (меньшее из двух). Это O(n log m), что так же хорошо, как и при обычной нижней границе отличимости элементов.

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