我有一个工作列表和等待这些工作的工人队列。所有的工作都是一样的,但工人是不同的,并根据他们执行工作的能力进行分类。也就是说,第一个人可以最好地完成这项工作,第二个人可以做得更差一点,依此类推。工作总是被分配给当时空闲的人中技能最高的人。当一个人被分配一份工作时,他会退出队列一段时间。但是当他完成后,他又回到了他的位置。因此,例如,在某个时刻,工作队列看起来像:
[x, x, .83, x, .7, .63, .55, .54, .48, ...]
其中x
's 代表失踪工人,数字显示离开工人的技能水平。当有新工作时,它被分配给第 3 名工人,作为可用工人中技能最高的一名。所以下一刻队列看起来像:
[x, x, x, x, .7, .63, .55, .54, .48, ...]
假设此时工人 #2 完成了他的工作并返回列表:
[x, .91, x, x, .7, .63, .55, .54, .48, ...]
我希望这个过程现在完全清楚了。我的问题是使用什么算法和数据结构来实现工人的快速搜索和删除以及插入回他的位置。
目前我能看到的最好的方法是使用已摊销的斐波那契堆O(log n)
来删除最小元素(分配作业并从队列中删除工作人员)O(1)
并将他插入回来,这非常好。但是,是否有更好的算法/数据结构可能考虑到元素已经排序并且不时地从队列中删除的事实?