带有丢弃元素的排序队列

时间:2012-11-23 17:02:50

标签: algorithm data-structures

我有一个工作列表工作人员队列等待这些工作。所有工作都是相同的,但工人是不同的,并根据他们执行工作的能力排序。也就是说,第一个人可以做到最好,第二个人可以做得更差,等等。作业总是分配给当时免费技能最高的人。当人被分配工作时,他会退出队列一段时间。但是当他完成后,他又回到了自己的位置。因此,例如,在某个时刻,工作队列看起来像:

[x, x, .83, x, .7, .63, .55, .54, .48, ...]

其中x代表失踪工人,数字显示左撇子工人的技能水平。当有新工作时,它被分配给第三工人,作为具有最高技能的工人。所以下一刻队列看起来像:

[x, x, x, x, .7, .63, .55, .54, .48, ...]

让我们说,在这一刻,工人#2完成了他的工作并回到了清单:

[x, .91, x, x, .7, .63, .55, .54, .48, ...]

我希望现在这个过程完全清楚。我的问题是算法数据结构用于实现快速搜索和删除工作人员插回到他的立场。

目前我能看到的最佳方法是使用已经摊销O(log n)斐波那契堆来删除最小元素(从队列中分配作业和删除工作人员)和{{1}把他插回来,这很不错。但是,是否有更好的算法/数据结构可能会考虑到元素已经排序并且不时只丢弃队列这一事实?

2 个答案:

答案 0 :(得分:2)

使用常规heap,它比Fibonacci堆更容易实现,并且还支持O(lg n)中的插入和删除(您有与插入一样多的删除,因此获得更便宜的插入不值得那么多)。与Fibonacci堆相反,常规堆通常在标准库中实现,例如C ++中STL中的priority_queue

如果存在更快的数据结构,您可以使用它来执行比Omega(n lg n)更快的排序,这在一般情况下是不可能的。如果技能级别数字具有一些特殊属性(例如,它们是限制范围内的整数),则可以比Omega(n lg n)更快地执行排序,但我不知道在这种情况下是否存在更快的优先级队列。

(顺便说一句,“rambo编码器”的评论是绝对正确的;你应该将实际的性能与堆的比较与未排序的列表进行比较。)

答案 1 :(得分:2)

作为理论练习,您可以考虑预处理数据以将所有内容减少为在整个队列中定位的小整数。首先想到的是http://en.wikipedia.org/wiki/Van_Emde_Boas_tree,理论上可以将log n减少到log log n。请注意,在本文的最后,有一些想法稍微不那么不切实际的解决方案。关于小整数键的情况下,关于http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.137.8757的文章(在恒定时间内具有减少键的整数优先级队列...)特别声称在理论上优于斐波纳契树,并且注意到与排序问题的链接 - 并引用另一篇带有排序链接的论文 - 也非常理论化。