【发布时间】:2012-05-28 11:12:05
【问题描述】:
我正在用 C++ 编写一个应用程序,其中对优先级队列进行 O(1) 出队操作至关重要,而入队的复杂性并不那么重要(除非它变成 n^2 或 2^n当然)。
起初我使用的是链表。它非常适合出队 (O(1)),并且具有良好的入队复杂性。唯一的问题是,对其进行排序。并不是说使用具有 O(n) 复杂度的插入排序就可以满足我的需求。但是对链表进行排序是一件很痛苦的事情。太慢了。
矢量一点都不好。出队将是 O(n) 将所有元素移回一个位置。入队仍然是 O(n),但要快得多。
你能推荐更高效的方法吗?谢谢。
【问题讨论】:
-
在你说的问题中,“Enqueue 的复杂性并不那么重要(当然,除非它变成 n^2 或 2^n)”。然后在 cmets 中,您说重新分配向量(即
O(n))太慢了。下定决心:-) -
我没有得到两件事:(1)使用归并排序对链表进行排序非常容易。 (2) 如果您将所有对象排入列表,则无需对其进行排序,因为它已经排序。简单插入正确位置的链表已经有 O(1) 出队和 O(n) 入队。不需要排序。奇怪。
-
@SteveJessop 对我来说,出队操作更重要。但是我不希望 Enqueue 成为瓶颈。这将是一个非常大的软件中的一部分。该列表可能包含数百个元素...
-
@antti.huima 我正在使用插入排序,因为它对于已经排序的列表比其他排序更有效。当然,将元素放在正确的位置会更有效。我只是没有坚持 :(
-
@Alfa:请注意,从长远来看,每个元素添加一次,最多删除一次。所以堆提供了最好的整体性能,因为这两个操作都可以是
O(log n)。除非您更详细地了解使删除速度比这更快的特定要求是什么,否则您将无法获得最佳建议。大概是为了使卸妆器对 I/O 或 GUI 或其他东西更具响应性。与堆相比,您希望放弃整体性能以加快删除速度。但你并不是说总体上应该慢多少。
标签: c++ algorithm priority-queue