Java 以编程方式确定数组是否可以是一组10项上的加权快速联合算法的结果?
我希望能够以编程方式检查数组,并确定它是否可能是加权快速联合算法的结果。对于我们这些需要复习的人来说,加权快速联合的java实现非常有用 加权快速联合算法的基本思想是,始终将较小的树连接到较大的树,以最小化高度,从而优化任何遍历函数 例如,看起来像Java 以编程方式确定数组是否可以是一组10项上的加权快速联合算法的结果?,java,algorithm,Java,Algorithm,我希望能够以编程方式检查数组,并确定它是否可能是加权快速联合算法的结果。对于我们这些需要复习的人来说,加权快速联合的java实现非常有用 加权快速联合算法的基本思想是,始终将较小的树连接到较大的树,以最小化高度,从而优化任何遍历函数 例如,看起来像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,初始数
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,初始数组的大小)
然而,像012841789
这样的数组可能是加权快速并集的结果
我想写一个如下的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
}
理想情况下,我如何使用可用的数据结构编写这样的方法?“像***这样的数组不能是加权快速并集,因为树的高度加在一起是4,大于log(N)(其中N是10,初始数组的大小)。”
事实上,这种情况下的最大高度是ceil(log_2(N)),即4。要检查这一点,只需从一开始就不断合并具有相同高度的树
此属性保留在所有子树中,这是对您的问题的一个很好的回答,因为您可以只检查此属性
仍然存在的问题是,如何才能以最高效的方式实现这一点。我想您刚刚收到一个数组并正在检查它。因此没有其他可用信息。如果是这种情况,您可以为高度创建一个辅助数组。然后,您必须遍历id数组,找到叶,然后在第二步中,从叶递归到根,更新高度值,并与子树中的元素数进行比较。我正在寻找用代码回答此问题的方法。检查树的高度是否足以确定它是否可能是加权快速联合的结果?另外,如何以编程方式实现这一点?