Complejidad de aplicar una permutación en el lugar


27

Para mi sorpresa, no pude encontrar documentos sobre esto, probablemente busqué las palabras clave incorrectas.

Entonces, tenemos una variedad de cualquier cosa, y una función en sus índices; es una permutación.ff

¿Cómo reordenamos la matriz de acuerdo con con memoria y tiempo de ejecución tan cerca de y como sea posible?fO(1)O(n)

¿Existen condiciones adicionales cuando esta tarea se vuelve más fácil? Por ejemplo, cuando sabemos explícitamente que una función es la inversa de ?gf

Sé de un algoritmo que sigue ciclos y recorre un ciclo para que cada índice verifique si es el menor en su ciclo, pero nuevamente, tiene el peor tiempo de ejecución de , aunque en promedio parece comportarse mejor ...O(n2)


Una observación fácil: si no solo se puede escribir la matriz de los elementos, sino también la matriz que contiene la función f, entonces es fácil realizar la tarea en tiempo O (n) utilizando registros enteros O (1) (cada uno de longitud O ( log n) bits) y espacio adicional para un artículo simplemente siguiendo cada ciclo. Pero esto no funciona si la función f se da en un almacenamiento de solo lectura (o f se da solo como un oráculo), lo que creo que es una suposición en esta pregunta.
Tsuyoshi Ito

23
Fich y col. 1995 : tiempo, espacio. También discute algunos casos especiales. O(nlogn)O(logn)
Jukka Suomela

Sí, supongo que tenemos f como un oráculo.
jkff

3
@JukkaSuomela, deberías convertir eso en una respuesta. Además, considerando que es una permutación arbitraria, un argumento de entropía simple produce espacio y / o tiempo, por lo que me sorprendería si pudiera hacerlo mejor que en tiempo y espacio . fO(nlogn)O(nlogn)
usuario834

Respuestas:


4

Opción 0: Permuting In Place (1995) de Faith E. Fich, J. Ian Munro, Patricio V. Poblete tiempo espacio.O(nlogn)O(log2n)

Opción 1: Haga trampa comprimiendo su permutación a una estructura de datos sucinta, consulte Munro http://www.itu.dk/people/ssrao/icalp03-a.pdf .

Opción 2: use una descomposición del ciclo principal para almacenar la permanente de manera sucinta y use ese espacio adicional para hacer trampa http://oeis.org/A186202

Opción 3: realizar un seguimiento del índice más grande de cada ciclo manipulado. Para cada iteración, use el índice invisible más grande para mover todo en su ciclo por uno. Si llega a un índice visto, deshaga todo ese trabajo porque el ciclo ya ha sido manipulado. tiempo, espacio.O(n2)O(#cycleslogn)

Opción 4: realice un seguimiento del índice más grande de cada ciclo manipulado, pero solo hágalo en lotes de distintas duraciones de ciclo. Para cada iteración, use el índice invisible más grande para mover todo en su ciclo por uno. Si llega a un índice visto, deshaga todo ese trabajo porque el ciclo ya ha sido manipulado. tiempo, espacio.O(n2distinct_cycle_lengths)O((#cycles_with_same_size)logn)

Opción 5: del mismo documento de Munro que la Opción 0, para gire el ciclo de si es el índice más grande en ese ciclo. tiempo y espacio.i=1..np(i)iO(n2)O(logn)


los métodos de compresión pueden no ahorrar espacio en general: el peor de los casos para almacenar una permutación es . 3, 4 y 5 en general parecen tan malos como la solución que OP ya conoce o la solución de Fich, Munro y Poblete. Y esa solución ya fue señalada por @Jukkanlogn
Sasho Nikolov el

# 5 usa menos espacio que # 0 por un factor log (n).
Chad Brewbaker

1

Si usa la representación de ciclo de la permutación, necesita 1 elemento de matriz adicional para almacenar el elemento que se está permutando actualmente y puede ejecutar los ciclos en operaciones peores O (N).


2
jkff ya dijo que conoce el algoritmo de seguimiento del ciclo, por lo que claramente quiere que la permutación misma sea tratada como (cerca de) una caja negra. Como señala en la pregunta, la conversión de un cuadro (casi) negro a una representación cíclica podría llevar un tiempo O (n ^ 2).
Joshua Grochow

La caja negra p (i) está bien. Simplemente das la vuelta al ciclo hasta que vuelvas a i. El problema es uno de la complejidad de Kolomogorov para almacenar la lista de elementos que se han actualizado para que no los ciclo varias veces. Munro tiene límites en eso. itu.dk/people/ssrao/icalp03-a.pdf
Chad Brewbaker

-2

Cualquier permutación de N elementos se puede convertir a cualquier otra permutación utilizando N-1 o menos intercambios. El peor de los casos para este método puede requerir llamadas O (n ^ 2) al oráculo, F (). Comience desde la posición más baja. Sea x la posición que estamos intercambiando actualmente.

Si F (x)> = x, intercambie las posiciones xy F (x). De lo contrario, debemos encontrar dónde está actualmente el elemento que estaba en la posición F (x) en la lista. Podemos hacer esto con la siguiente iteración. Deje y = F (x). Hacer hasta y> = x: y = F (y): Fin Do. Ahora intercambie las posiciones x e y.


3
OP ya dijo que sabe cómo hacerlo en el tiempo . O(n2)
Jukka Suomela

Lo siento. Soy nuevo en este grupo. Me gusta este método por su simplicidad. A veces encuentro la simplicidad más rápido que la eficiencia. Conozco otro método que requiere O (n) pasos, pero O (nlogn) espacio.
Russell Easterly,

1
Russell, incluso asignar y poner a cero el espacio O (n log n) ya es O (n log n), ¿querías decir en la otra dirección?
jkff

Realmente no tienes asignar y cero espacio. La idea básica es cuando F (x)> x necesitamos recordar dónde colocamos el elemento en la posición x. Para una n realmente grande, usaría una base de datos y solo mantendría un registro de dónde se mueve el elemento x. El registro podría eliminarse cuando x llega a su ubicación final.
Russell Easterly

1
Pero, ¿por qué dice que requiere espacio O (n log n)?
jkff

-2

Este método usa el inverso de F y requiere n bits de almacenamiento. Si x es la posición de un elemento en la matriz original, deje que G (x) sea la posición del elemento en la matriz ordenada. Deje B ser una matriz de n bits. Establezca todos los n bits de B en 0.

PARA x = 1 a n-1: SI B (x) == 0 ENTONCES: y = G (x): HAGA HASTA x == y: Intercambie las posiciones x e y: B (y) = 1: y = G ( y): LOOP: ENDIF: NEXT X

Este método sigue intercambiando el elemento actualmente en la posición x a la posición final del elemento. El bucle interno termina cuando el elemento correcto se cambia a la posición x. Dado que cada intercambio mueve al menos un elemento a la posición final del elemento, el bucle interno Do no puede ejecutarse más de n-1 veces durante la ejecución. Creo que este método es O (n) tiempo y espacio.


2
¿Has mirado el periódico? Los dos algoritmos que enumera aquí son los dos "obvios". El documento tiene otros menos obvios con diferentes compensaciones espacio-temporales, en particular mucho menos espacio.
Yuval Filmus
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.