Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 以编程方式确定数组是否可以是一组10项上的加权快速联合算法的结果?_Java_Algorithm - Fatal编程技术网

Java 以编程方式确定数组是否可以是一组10项上的加权快速联合算法的结果?

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,初始数

我希望能够以编程方式检查数组,并确定它是否可能是加权快速联合算法的结果。对于我们这些需要复习的人来说,加权快速联合的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,初始数组的大小)

然而,像
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数组,找到叶,然后在第二步中,从叶递归到根,更新高度值,并与子树中的元素数进行比较。

我正在寻找用代码回答此问题的方法。检查树的高度是否足以确定它是否可能是加权快速联合的结果?另外,如何以编程方式实现这一点?