Java 如何识别属于最大堆的元素和属于最小堆的元素?
本节选自《破解编码访谈》第5版 数字随机生成并存储在(扩展)数组中。怎么 你能跟踪一下中位数吗 作者向我们介绍了一个基于堆的解决方案: 堆在基本排序和跟踪max和 分钟。这其实很有趣——如果你能跟踪 元素的大半部分和小半部分。较大的一半是 保存在一个最小的堆中,这样最大的一半中最小的元素 这是根本问题。较小的一半保存在max堆中,以便 最小的一半中最大的元素在根部。现在有了这些 在数据结构中,在根位置有潜在的中间元素。“ 如果堆的大小不再相同,您可以快速“重新平衡” 通过从堆中弹出一个元素并将其推到 另一方面 关于这种方法,我有几个问题,我一次问一个,以保持它的条理性。 首先,使用这种方法,如果遍历数组中的元素,您如何知道特定元素属于该算法所描述的最小堆或最大堆?Java 如何识别属于最大堆的元素和属于最小堆的元素?,java,arrays,algorithm,sorting,heap,Java,Arrays,Algorithm,Sorting,Heap,本节选自《破解编码访谈》第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,这里有一种方法来填充细节 我们保持以下不变量
中位数可以是最小堆中的最小元素,也可以是该元素和最大堆中的最大元素的平均值,这取决于大小差是1还是0。ohhh谢谢!!这很有意义。因此,在偶数情况下,首先通过将两个堆的长度相加来检查数据集的长度是否为偶数。然后平均t最大堆和最小堆的根?好吧,您正在维护堆大小相等(或最多相差1)的属性,但是是的。但是如果数据集是奇数的,你会有一个int计数器并在最大堆和最小堆中迭代,直到达到该计数器吗?…不,如果数据集是奇数的,你的一个堆比另一个堆大一个元素。如果下堆比上堆大,那么中间值就是该堆中的最大元素;或者erwise它是上层堆中的最小元素。是的,迭代也是O(N)。效率低下