连接这两个概念需要帮助

时间:2011-02-15 18:25:58

标签: algorithm data-structures queue linked-list

最近拿起了“Ring Queue”的概念,因为我比较熟悉Tortoise和Hare算法的链表循环检测,我想知道Ring Queue的工作原理是否与Linked List中的上述循环检测算法有某种联系因为他们都在围绕一个周期进行遍历,所以两个指针相遇。

3 个答案:

答案 0 :(得分:5)

circular-buffer是数据结构,Floyd's algorthm是...算法,因此任何类比都有限制。

但我会尝试:

+-------------------+-----------------------------------+---------------------------+
|                   |          Circular buffer          |     Floyd's algorithm     |
+-------------------+-----------------------------------+---------------------------+
| Tortoise          | Start pointer                     | Slow pointer              |
| Hare              | End pointer                       | Fast pointer              |
| Act I             | Tortoise sleeps, hare walks       | Tortoise walks, hare runs |
| Act II            | Hold hands; walk together forever | No act II                 |
| Ends Romantically | Yes                               | Only if a cycle exists    |
+-------------------+-----------------------------------+---------------------------+
  1. 第一幕:循环缓冲龟开始故事睡眠,与Floyd的算法不同,它也会移动(虽然很慢)。
  2. 高潮:如果野兔遇到乌龟,那么这个循环已经“找到”了。这是保证发生在循环缓冲区中,尽管乌龟已经睡眠(缓冲区是圆形的,因此其中的所有点都是循环的一部分)。这与Floyd的算法不同,其中会议可能不会发生,因为链表可能没有循环。此外,周期(如果存在)可能不包括起点,这就是为什么睡觉的乌龟不适合它的情节。
  3. 第二幕/结局:当野兔在圆形缓冲区遇到(睡觉)的乌龟时,它会把它唤醒,然后它们齐声走在一起,永远地穿越这个循环。在弗洛伊德的算法中,两人的会面是故事的结尾,虽然故事也可能以野兔到达终点线而结束(与其他人会面?)。

答案 1 :(得分:0)

我认为你只是在这里看到模式。

循环缓冲区只是一种数据结构。乌龟& Hare算法也适用于不仅仅是循环队列的东西,甚至在“指针”是隐式的情况下(比如找到函数的固定点)。

答案 2 :(得分:0)

我不确定这些是否直接相关。

在链表检测算法中,我们试图通过选择一种方案来检测链表中循环的可能性,如果有列表则强制两个指针发生冲突。

在循环缓冲区中,指针冲突意味着缓冲区已满或者它是空的。

我对这里唯一可以得出的连接的猜测是,循环数据结构可以检测某些条件,只有两个指针在本地移动,而不是更“全局”的算法。例如,在链表中查找循环也可以通过DFS完成。