以编程方式确定数组是否可能是一组10个项目的加权快速联盟算法的结果?

时间:2014-10-30 17:42:50

标签: java algorithm

我希望能够以编程方式检查数组,并确定它是否可能是加权快速联盟算法的结果。对于我们这些需要复习的人来说,加权快速联盟的java实现是here

加权快速联合算法的基本思想是始终将较小的树连接到较大的树,以便最小化高度,从而优化任何遍历函数。

例如,看起来像8 4 8 8 8 3 8 3 9 7的数组不能是加权快速联盟的结果,因为它包含一个周期9->7->3->8->9

8 0 9 3 6 6 0 4 8 0这样的数组不能是加权快速联合,因为树的高度一起是4,这大于log(N)(其中N是10,即初始数组的大小)。 / p>

然而,像0 1 2 8 4 1 1 7 8 9这样的数组可能是加权快速联合的结果。

我想写一个像这样的Java函数:

public static boolean canBeResultOfWeightedQuickUnion(int[] id){
    //returns whether or not the given array of ints could have been the result of a weighted quick union
}

我怎样才能编写这样的方法,理想情况下使用可用的数据结构here

1 个答案:

答案 0 :(得分:-1)

“像***一样的数组不能是加权快速联合,因为树的高度一起是4,这大于log(N)(其中N是10,初始数组的大小)。” / p>

实际上,在这种情况下,最大高度为ceil(log_2(N)),即为4. 要检查这一点,只需从开始就保持合并树的高度

此属性适用于所有子树,对于您的问题,这是一个非常好的答案,因为您可以检查此属性。

问题仍然是如何以最高效率完成此任务。我想你刚收到一个数组并正在检查它。所以没有其他信息可用。如果是这种情况,您只需为高度创建一个辅助数组。然后你必须通过id数组,找到叶子,然后在第二步递归地从叶子到根,更新高度的值,并与子树中的元素数量进行比较。