我写了一个小片段,找到Min Heap中两个节点之间的最短路径。
if(!is_array($a)) \\check whether $a is not an array
$a=[$a] \\change $a to an array with only one element which was previously stored in $a
有更好的方法来做更好的平均情况吗?刚刚学习。
编辑:
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;
}
为简单起见,我们假设这个数组是二进制堆。根是1,最简单路径(5,7)给出了5和7之间的最短路径。
答案 0 :(得分:1)
如果我是对的,i和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;
}