采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
波波老师,这里有个特殊的case,一起讨论一下。 假设数组大小是5,最大堆大小为4,在前四个元素入堆后,第五个元素假设是最大的,此时入堆,如果没有将堆中最小的元素替换出来,则最终堆中的四个元素不是大小为5的数组中,最大的4个元素。 所以这里不能简单的将堆中最后一个元素删除,因为最后的叶子节点不一定是最大堆的最小值,这里就需要从M/2中选出最小值,然后删除。 所以当N远大于M时,算法概率上出问题是很低的。但是如果N和M相近,算法大概率会出问题的。
算法没有问题。这不是一个概率算法,和概率一点儿关系都没有。
首先需要纠正的是,找 n 个元素的最大的 m 个元素,需要的是最小堆,不是最大堆。这个包含 m 个元素的最小堆中,保存着已知的最大的 m 个元素。堆顶是这最大的 m 个元素中的最小值。所以,如果新元素比堆顶元素大,也就是有了一个更大的元素出现,就把堆顶元素拿走,新元素入堆,维护了堆中是已知的最大的 m 个元素。
因此,你的叙述“这里不能简单的将堆中最后一个元素删除”也不对。我们不是将堆中最后一个元素删除,是将堆顶元素删除。
再仔细理解一下这个思路?
继续加油!:)
谢谢波波老师,确实理解错误了,也很感谢你这么快速准确的回复。
登录后可查看更多问答,登录/注册
动态数组/栈/队列/链表/BST/堆/线段树/Trie/并查集/AVL/红黑树…
10.3k 16
1.4k 17
1.3k 14
1.2k 14