在循环队列中查找项目?

时间:2009-06-05 13:32:02

标签: queue

我有一个循环的有序物品队列。我想知道是否有一个值为“x”的项目。

执行此操作的最佳方法(算法)是什么?

4 个答案:

答案 0 :(得分:2)

“最佳”是一个主观术语,循环队列很少大到足以保证二进制搜索,因此在缺少有关队列大小的信息时我会选择简单。最简单的方法就是从头部开始并检查每个元素,直到尾部(或者你已经超出它的顺序)来查看它是否存在。

假设您的头部变量指向将被移除的第一个项目,尾部指向下一个放置项目的位置。进一步假设您浪费了一个项目槽来简化代码(简化代码并告诉空队列和完整队列之间的区别)。这意味着空队列由tail == head表示。

ptr = head
while ptr != tail:
    if element[ptr] = searchvalue:
        return true
    if element[ptr] > searchvalue:
        return false
    ptr = (ptr + 1) % queuesize;
return false

答案 1 :(得分:2)

如果您可以按索引访问每个项目,则可以使用二进制搜索。

如果您只能看到第一个项目,则需要从队列中弹出它们,直到搜索键低于您刚刚弹出的项目的键。由于队列已排序,因此只要您知道密钥不再在队列中就可以停止。

[编辑]因为您可以通过索引访问:在一个对象中扭曲循环队列,该对象将其映射到“数组”(即使用get(index)index运行的方法0 } length-1,内部((index+start)%length)

这样,您可以在不考虑实际数据布局的情况下应用二进制搜索。

答案 2 :(得分:0)

我们可以向相反方向移动吗?即从尾到头。如果是这样,那么我们可以设计出可以利用它的东西。即决定进行搜索的方式。

由于它是有序的,我们可以猜测它的位置(只是一个猜测或者可能利用统计数据,如果有的话),然后只在方向上开始全面搜索,这样可以减少结果

答案 3 :(得分:0)

我怀疑该OP具有固定大小的圆形缓冲区。出现两个搜索条件。

一个在缓冲区正在填充时,一个在缓冲区被填充时发生回绕,并且以前的存储被覆盖。

第一种情况是线性搜索,其起始“插槽”为零,并且大概记录/维护了结束插槽。

第二种情况比较棘手。当先前的存储被覆盖时,起始插槽将循环。结束插槽也开始流通,仅在开始插槽之后的一个位置。

要对这些移动索引进行线性搜索,需要进行平移,以将开始时隙设置为零,将结束时隙设置为缓冲区大小。

该算法的工作方式尚未确定。