33 votos

Prueba de Ciclo de Floyd Chasing (Tortuga y Liebre)

Estoy buscando una prueba del algoritmo de detección de ciclos de Floyd, también conocido como algoritmo de la liebre y la tortuga. Después de investigar un poco, descubrí que la prueba involucra la aritmética modular (lo cual es lógico ya que estamos tratando con ciclos).

Sin embargo, no puedo encontrar ninguna prueba que funcione para un ciclo general de este formato: enter image description here

Estoy tratando de demostrar dos cosas.

Primero, si existe un ciclo, y avanzas la tortuga un nodo cada unidad de tiempo pero la liebre dos nodos cada unidad de tiempo, entonces eventualmente se encontrarán.

Segundo, cuando se encuentren la tortuga estará $n$$\alpha$ distancia del inicio de la secuencia (donde $\alpha$ es la longitud del bucle) y también $n$$\alpha$ distancia de la liebre.

40voto

paw88789 Puntos 19712

Si la cola preliminar tiene longitud $T$ y el ciclo tiene longitud $C$ (así que en tu imagen, $T=3$, $C=6$), podemos etiquetar los nodos de la cola (comenzando en el que está más lejos del ciclo) como $-T, -(T-1),..., -1$ y los nodos del ciclo como $0, 1, 2, ..., C-1$ (con la numeración de los nodos del ciclo orientada en la dirección del recorrido).

Podemos utilizar el algoritmo de la división para escribir $T=kC+r$ donde $0\le r

Después de $T$ clics, la tortuga está en el nodo $0$ y la liebre está en el nodo $r$ (ya que la liebre ha avanzado $2T$ pasos, de los cuales los primeros $T$ estuvieron en la cola, dejando $T$ pasos en el ciclo, y $T\equiv r \pmod{C}$).

Suponiendo que $r\ne 0$, después de $C-r$ clics adicionales, la tortuga está en el nodo $C-r$; y la liebre está en el nodo congruente $\pmod{C}$ a $r+2(C-r)=2C-r\equiv C-r \pmod{C}$. Por lo tanto, ambos animales están en el nodo $C-r$. [En el caso $r=0$, puedes comprobar que los animales se encuentran en el nodo $0].

La distancia desde el inicio en este momento de encuentro es entonces $T+C-r=(kC+r)+C-r=(k+1)C$, un múltiplo de la longitud del ciclo, como se deseaba. Además, podemos notar que esta ocurrencia es en el primer múltiplo de la longitud del ciclo que es mayor o igual a la longitud de la cola.

12voto

encomiast3 Puntos 11

Esto se puede generalizar un poco, para tener tamaños de paso $>2$ y que la tortuga y la liebre no necesariamente empiecen en el mismo nodo. Todos los tamaños de paso $>2$ funcionan si empiezan en el mismo nodo. Si empiezan en nodos diferentes, entonces solo un tamaño de paso de 2 está garantizado que funcione sin importar la longitud del ciclo.

Sea $T =$ el número de nodos antes del inicio del ciclo. Sea $C =$ la longitud del ciclo. Sea $S =$ el tamaño de paso de la liebre (2 para el problema tal como se presenta).

Después de $n$ iteraciones, la tortuga ha avanzado $n$ nodos, y la liebre $nS$. La liebre y la tortuga están en el mismo nodo siempre que $n \geq T$ y $n-T \equiv nS-T$ mod $C$. Entonces estamos buscando soluciones de $n(S-1) \equiv 0$ mod $C$ con $n \geq T$.

Cuando $S=2$ como en el problema tal como se presenta, esto se reduce a $n\equiv0$ mod $C$. Esto sucede exactamente cuando $n$ es un múltiplo de $C$.

Cuando $S>2$ también sucede en cada múltiplo de $C$, pero también puede suceder en otros momentos si $S-1$ y $C$ no son primos entre sí.

Eso cubre empezar en el mismo nodo. Para empezar en nodos diferentes, sea $h =$ el nodo de inicio de la liebre, y $t=$ el nodo de inicio de la tortuga.

Entonces necesitamos resolver $n(S-1) \equiv t-h$ mod $C$ en lugar de $n(S-1) \equiv 0$, sujeto a $t+n\geq T$.

Cuando $S=2$, eso es $n\equiv t-h$ mod $C$, lo cual tiene soluciones $n = t-h+kC$ para todos los enteros $k$. Cuando $S>2$, es posible que $n(S-1)\equiv t-h$ mod $C$ no tenga soluciones.

De hecho, incluso se puede generalizar más, permitiendo que la tortuga tenga un tamaño de paso $>1$. Mientras la tortuga y la liebre empiecen en el mismo nodo, y la liebre tenga un tamaño de paso más grande que la tortuga, seguirá funcionando. Si $S_h$ es el tamaño de paso de la liebre y $S_t$ es el tamaño de paso de la tortuga, entonces en lugar de $n(S-1)\equiv 0$ mod $C$ tenemos que resolver $n(S_h-S_t)\equiv 0$ mod $C$.

2voto

Nitin Verma Puntos 46

Digamos que hay $l$ elementos antes de que comience el bucle y $n$ elementos en el bucle. Y $e_l$ es el primer elemento del bucle que se ve cuando recorremos la lista enlazada. Cuando digamos "un elemento $x$ pasos adelante de $e$", eso significará que podemos llegar a ese elemento tomando $x$ pasos desde $e$.

Ahora, cuando Tr (tortuga) llega a $e_l$, después de $l$ iteraciones, digamos, Hr (Liebre) está $x$ pasos adelante de $e_l$. Desde que Hr ha dado un total de $2l$ pasos para entonces ($l$ pasos antes del bucle), entonces:

$x = l \bmod n$.

En cada iteración futura, Tr y Hr avanzarán 1 y 2 pasos respectivamente, y así cada iteración aumentará su "brecha" en 1. Así que se encontrarán después de $n-x$ iteraciones adicionales, cuando su brecha se convierta en $x + (n-x) = n$.

Entonces, hasta ese encuentro, Tr ha dado un total de pasos = (pasos hasta $e_l$) + (pasos posteriores a $e_l$)

\= $l + (n-x)$

\= $l + n - l \bmod n$

\= $n + (l- l \bmod n)$

\= un múltiplo de $n$

Dado que Hr da 2 pasos en cada iteración, entonces, hasta el encuentro debe haber dado el doble de los pasos de Tr, nuevamente un múltiplo de $n$.

Puedes consultar este artículo (escrito por mí) para más información.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X