Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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 如何识别属于最大堆的元素和属于最小堆的元素?_Java_Arrays_Algorithm_Sorting_Heap - Fatal编程技术网

Java 如何识别属于最大堆的元素和属于最小堆的元素?

Java 如何识别属于最大堆的元素和属于最小堆的元素?,java,arrays,algorithm,sorting,heap,Java,Arrays,Algorithm,Sorting,Heap,本节选自《破解编码访谈》第5版 数字随机生成并存储在(扩展)数组中。怎么 你能跟踪一下中位数吗 作者向我们介绍了一个基于堆的解决方案: 堆在基本排序和跟踪max和 分钟。这其实很有趣——如果你能跟踪 元素的大半部分和小半部分。较大的一半是 保存在一个最小的堆中,这样最大的一半中最小的元素 这是根本问题。较小的一半保存在max堆中,以便 最小的一半中最大的元素在根部。现在有了这些 在数据结构中,在根位置有潜在的中间元素。“ 如果堆的大小不再相同,您可以快速“重新平衡” 通过从堆中弹出一个元素并将其

本节选自《破解编码访谈》第5版

数字随机生成并存储在(扩展)数组中。怎么 你能跟踪一下中位数吗

作者向我们介绍了一个基于堆的解决方案:

堆在基本排序和跟踪max和 分钟。这其实很有趣——如果你能跟踪 元素的大半部分和小半部分。较大的一半是 保存在一个最小的堆中,这样最大的一半中最小的元素 这是根本问题。较小的一半保存在max堆中,以便 最小的一半中最大的元素在根部。现在有了这些 在数据结构中,在根位置有潜在的中间元素。“ 如果堆的大小不再相同,您可以快速“重新平衡” 通过从堆中弹出一个元素并将其推到 另一方面

关于这种方法,我有几个问题,我一次问一个,以保持它的条理性。 首先,使用这种方法,如果遍历数组中的元素,您如何知道特定元素属于该算法所描述的最小堆或最大堆?
假设我们的数据元素是[20,39,14,7,86,90]。当您迭代数组时,您将放置什么堆,比如说20?

每次插入元素时,检查最小堆的最小值和最大堆的最大值,以查看每个元素属于哪个堆

当您看到20时,两个堆都是空的,所以这无关紧要——假设在平局的情况下,我们将把元素放在较小元素的最大堆中

[20] []

当你看到39时,它比20大,所以它在上面的堆中

[20] [39]

14小于20,因此它位于较低的堆中

[14,20][39]

7小于20,所以它进入较低的堆中,但是较低的堆现在太大了,所以20从较低的堆中出来,进入较高的堆中

[7,14][20,39]

86>20,因此它进入上层堆

[7,14][20,39,86]

90>20,所以它进入上层堆,但是上层堆现在太大了,所以20从上层堆出来,回到下层堆

[7,14,20][39,86,90]


哪种方式实现平衡并不重要——也许您应该坚持使用较低的heap has size,这里有一种方法来填充细节

我们保持以下不变量

  • 到目前为止,最小堆和最大堆内容的多集并集是输入

  • 最大堆中的所有元素不大于最小堆中的所有元素

  • 最小堆的大小减去最大堆的大小是零或一

  • 要扫描新元素,我们将其插入最小堆。大小的差异现在是一个或两个。如果是两个,我们从最小堆中弹出最小元素,并将其插入最大堆,还原不变量3


    中位数可以是最小堆中的最小元素,也可以是该元素和最大堆中的最大元素的平均值,这取决于大小差是1还是0。

    ohhh谢谢!!这很有意义。因此,在偶数情况下,首先通过将两个堆的长度相加来检查数据集的长度是否为偶数。然后平均t最大堆和最小堆的根?好吧,您正在维护堆大小相等(或最多相差1)的属性,但是是的。但是如果数据集是奇数的,你会有一个int计数器并在最大堆和最小堆中迭代,直到达到该计数器吗?…不,如果数据集是奇数的,你的一个堆比另一个堆大一个元素。如果下堆比上堆大,那么中间值就是该堆中的最大元素;或者erwise它是上层堆中的最小元素。是的,迭代也是O(N)。效率低下