我想知道当我们可以使用Collections.sort方法对堆栈进行排序时,为什么我们需要像max heap这样的新数据结构?谢谢
答案 0 :(得分:6)
堆栈和堆具有完全不同的属性和用法。
LIFO需要堆栈。对它进行排序将花费O(N * logN),推/弹O(1)。
优先级队列需要堆,例如,获取最小/最大元素将花费O(1),插入元素O(log(N))
您需要确定使用模式和目标,然后确定您需要什么。
答案 1 :(得分:1)
Collections.sort需要O(n log n)。因此,虽然通过在每次操作之后调用Collections.sort来模拟具有列表的堆是正确的,但是它将是不必要的低效率。堆允许您插入任何元素或检索O(log n)中的顶部元素。
当你需要排序一次时,Collections.sort很好。如果在修改集合时必须对集合进行排序,则使用已排序的数据结构(例如堆或树)会更有效。
答案 2 :(得分:0)
这取决于您的要求。 Stack和Heap中的访问模式完全不同。堆栈实现为简单列表,而Heap实现为优先级队列。堆栈中的排序时间是O(nlog(n)),而您可以在O(log(n))时间内提取最大优先级(Max / Min)的元素。
所以你的问题在哪里使用MaxHeap,想想你必须找到1000个中第7个最大元素的场景。在堆栈中必须首先排序然后从开始排序第7个(降序排序)将是解决方案但是使用MaxHeap你有提取元素7次和7次将是解决方案。所以这取决于你的情况,哪一个对你更好。