Есть ли лучший способ найти кратчайший путь между узлами в Min Heap
Я написал небольшой фрагмент, чтобы найти кратчайший путь между двумя узлами в Min Heap.
public int shortestPath(int i, int j)
{
int path = 0;
int hi = Math.max(i, j);
int lo = i + j - hi;
while (hi > lo)
{
hi = hi / 2;
path++;
}
if (hi == lo) return path;
while (hi != lo)
{
if (lo > hi) lo = lo / 2;
else hi = hi / 2;
path++;
}
return path;
}
Есть ли лучший способ сделать это с лучшим средним случаем? Только учится.
Редактировать:
int[] arr = {0, 1, 2, 3, 4, 5, 6, 7};
Для простоты предположим, что этот массив представляет собой двоичную кучу. Корень равен 1, а кратчайший путь между, скажем, 5 и 7 задается ShorttestPath(5, 7).
1 ответ
Решение
Если я прав, я и J индексы узлов хранятся в массиве
индексы составляют специальное двоичное дерево, а затем подсчитывают, сколько узлов в путях от LCA (i, j) до i и от LCA (i, j) до j
(LCA -> Самый низкий общий предок)
это можно сделать в O(log N), так как ваш код работает в O(log N)
но в более короткой реализации:
int shortestPath(int i, int j) {
int path = 0;
boolean b;
while (i != j) {
b = i > j;
i >>= (b ? 1 : 0);
j >>= (!b ? 1 : 0);
path++;
}
return path;
}