2011-02-15 69 views
4

最近拿起「Ring Queue」的概念,因爲我更熟悉Tortoise和Hare算法進行鏈表循環檢測,所以我想知道Ring Queue的工作原理是否與某些類型的連接有關上面的鏈接列表中的循環檢測算法,因爲它們都圍繞一個週期進行遍歷,然後兩個指針相遇。連接這兩個概念所需的幫助

回答

5

A 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. 第一幕:的循環緩衝龜開始的故事睡覺,不像弗洛伊德的算法,它也在發展(儘管速度緩慢)。
  2. 高潮:如果兔子遇到烏龜,週期就被「發現」了。這是保證發生在一個循環緩衝區,儘管烏龜一直在睡覺(緩衝區是圓形的,所以它的所有點都是週期的一部分)。這與Floyd算法不同,因爲鏈接列表可能沒有循環,因此會議可能不會發生。此外,週期(如果有的話)可能不包括起點,這就是爲什麼睡覺的烏龜不適合其情節。
  3. 第二幕/結局:當兔子在環形緩衝區遇到(睡覺)烏龜時,它將它喚醒,然後它們一起走到一起,一直往返循環。在弗洛伊德的算法中,兩人的會面是故事的結尾,儘管故事也可能以兔子到達終點(與其他人會面?)結束。
+1

+1對於愚蠢:) – dfb 2011-02-15 19:03:28

0

我想你只是在這裏看到模式。

循環緩衝區只是一個數據結構。 Tareo & Hare算法也適用於不僅僅是循環隊列的事情,甚至在「指針」是隱式的情況下(例如找到函數的固定點)。

0

我不確定這些是否直接相關。

在鏈表檢測算法中,我們試圖通過選擇一個強制兩個指針碰撞的方案來檢測鏈表中是否存在循環的可能性。

在循環緩衝區中,指針衝突意味着緩衝區已滿或爲空。

我的猜測是我們可以在這裏繪製的唯一連接是循環數據結構可以檢測到某些條件,只有兩個指針在本地移動,而不是更「全局」的算法。例如,在鏈表中查找循環也可以通過DFS完成。