Если я правильно интерпретирую ваш вопрос, вы застряли на этом этапе:
Но с pq, как можно использовать кучу здесь с более чем двумя соседями? Например, дочерние элементы (1,1) - это 4 указанных выше соседа. Это будет go против 2 * i и 2 * i + 1 и i / 2
Похоже, что вас сбивает с толку, так это то, что здесь есть две отдельные концепции, которые вы можете комбинировать вместе . Во-первых, есть понятие «два места в сетке могут быть рядом друг с другом». В этом мире у вас есть (до) четырех соседей для каждой локации. Далее следует форма двоичной кучи, в которой каждый узел имеет двух дочерних узлов, расположение которых задается определенными арифметическими c вычислениями индексов массива. Они полностью независимы друг от друга - двоичная куча не знает, что элементы, которые она хранит, поступают из сетки, а сетка не знает, что существует массив, в котором каждый узел имеет двух дочерних узлов, хранящихся в определенных положениях.
Например, предположим, что вы хотите сохранить местоположения (0, 0), (2, 0), (-2, 0) и (0, 2) в двоичной куче, и что веса этих местоположений равны 1, 2 , 3 и 4 соответственно. Тогда форма двоичной кучи может выглядеть так:
(0, 0)
Weight 1
/ \
(2, 0) (0, 2)
Weight 2 Weight 4
/
(0, -2)
Weight 3
Это дерево по-прежнему дает каждому узлу два дочерних элемента; эти дочерние элементы просто не обязательно сопоставляются с относительными позициями узлов в сетке.
В более общем смысле, относитесь к очереди с приоритетами как к черному ящику. Представьте, что это просто устройство magi c, которое говорит: «Вы можете дать мне новую вещь для хранения» и «Я могу дать вам самую дешевую вещь, которую вы пока что дали», и все. Тот факт, что внутренне он по совпадению реализован как двоичная куча, по сути не имеет значения.
Надеюсь, это поможет!