有没有更好的方法来找到Min Heap中节点之间的最短路径

时间:2016-07-24 21:40:16

标签: java algorithm shortest-path min-heap

我写了一个小片段,找到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之间的最短路径。

1 个答案:

答案 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;
}