Pila divisible


22

¿Qué se sabe sobre las estructuras de datos que pueden mantener una secuencia de elementos sujetos a las siguientes dos operaciones?

  • Push (x): agrega x al final de la secuencia y devuelve un identificador para su posición en la secuencia
  • Extracto (S): dado un conjunto desordenado de identificadores, eliminar los elementos en esas posiciones de la secuencia y devolver una lista de los elementos eliminados en orden de secuencia

Si lo desea, puede pensar en esto como una pila o una cola con una operación dividida que lo divide en dos pilas: la operación de extracción se puede utilizar para implementar una operación pop o de cola, y la secuencia extraída de elementos también se puede poner de nuevo en una pila o cola diferente.

Lo que ya sé: se puede mantener la secuencia como una lista doblemente vinculada, donde cada identificador es solo un puntero a un nodo de lista vinculada, y cada nodo también almacena un número de posición que permite comparaciones rápidas entre las posiciones de dos elementos no relacionados en la secuencia No es difícil actualizar los números de posición a medida que avanza la estructura de datos para que todos sean enteros positivos de valor máximo , donde es el número actual de elementos en la lista. Con esta estructura de datos, la única parte difícil de una operación de extracción es ordenar los elementos extraídos por sus números de posición. Una extracción de elementos toman k O ( k O(n)nkO(kloglogk) tiempo aleatorio esperado utilizando el algoritmo de clasificación de números enteros de Han y Thorup de FOCS 2002, por ejemplo, y una operación de inserción toma tiempo constante.

Lo que no sé: ¿es posible manejar el extracto en tiempo y presionar en tiempo constante? ¿Hay literatura sobre este problema? ¿Es tan difícil como la clasificación de enteros?O(k)

Motivación: este es el paso básico necesario para ordenar los elementos en el algoritmo de programación de Coffman-Graham, que también tiene aplicaciones en el dibujo de gráficos. La parte difícil de Coffman-Graham es un ordenamiento topológico lexicográfico. Esto puede hacerse manteniendo, para cada grado diferente, una secuencia de los vértices con ese grado en el subgrafo inducido por los vértices restantes. Luego, elimine repetidamente el primer vértice de la secuencia de vértices de cero grados y agréguelo al orden topológico; extraer los vecinos de de los grados a los que pertenecían anteriormente y empujarlos a la secuencia para el siguiente grado menor. Entonces unv O ( k )vvO(k) El tiempo para las operaciones de extracción en esta estructura de datos conduciría a una implementación de tiempo lineal del algoritmo de Coffman-Graham.

Desde que originalmente pregunté esto, encontré un artículo de Sethi de 1976 que permite que el algoritmo Coffman-Graham se implemente en tiempo lineal, y lo incluí en mi artículo de Wikipedia sobre el algoritmo Coffman-Graham , por lo que la motivación original es menos significativa. Sin embargo, todavía tengo curiosidad por saber cuál es la respuesta.


Si las inserciones ocurren solo al final de la secuencia, puede mantener tanto una lista con doble enlace como una tabla hash de las posiciones de los elementos. Inserción: O (1) amortizado (solo mantenga un puntero al último elemento). Extracción de k elementos: O (k) amortizado (para cada elemento de S, obtenga el puntero y elimínelo de la tabla hash, obtenga y elimine el elemento de la lista y agréguelo al resultado de extracción).
Marzio De Biasi

3
No es la extracción de los elementos de la lista lo que lleva tiempo, sino que los reorganiza desde el orden no ordenado del argumento para Extraer en el orden de secuencia correcto.
David Eppstein

Respuestas:


1

Creo que esto es al menos tan difícil como ordenar un conjunto de enteros con "consejos aleatorios" de polinomio de tamaño en . Por consejo aleatorio quiero decir que para cualquier hay una distribución fija (dependiendo solo de ) sobre cadenas de tamaño poly ( ) y nuestro algoritmo (modelado por una máquina RAM) tiene acceso aleatorio a un muestra única de . es la estructura de datos (aleatoria) después de presionar en orden, junto con una tabla hash que asigna enteros a identificadores en el tiempo esperado .n n D n n n D n D n [ n ] O ( 1 )S[n]nnDnnnDnDn[n]O(1)

Dada esa configuración, para una instancia del problema de ordenación de enteros, podemos emitir extract ( ) (en realidad necesitamos los identificadores de pero esta asignación se puede hacer en tiempo por elemento usando el tabla hash que forma parte del consejo) y la entrada se ordenará según el tiempo que lleve ejecutar el extracto.S S O ( 1 )S[n]SSO(1)

Entonces, el mensaje es que, a menos que alguna información secundaria "libre" que dependa solo del límite superior de los enteros pueda facilitar la ordenación de enteros, extraer es tan difícil como la ordenación de enteros.

¿Esto implica una relación entre los dos problemas sin el modelo extraño? ¿Es esta noción de consejo aleatorio algo conocido? Esto es algo así como un protocolo de MA, pero el mensaje de Merlin no puede depender de la entrada y nos preocupa el tiempo de ejecución de Arthur.


[n]DnΩ(n)DnΩ(n)k[n]O(n+k)O(k)
Dave

Ω(n)DnkO(k)Dn

Esta es la razón por la que no encuentro esta respuesta completamente convincente. Si solo tiene un conjunto S de enteros que desea ordenar, todo es tiempo lineal (solo cuente la ordenación en O (n + k)). Pero si está tratando de usar esta estructura de datos para simular una secuencia de muchos tipos pequeños (de modo que el tipo de conteo no es lo suficientemente bueno), entonces solo el primero de estos tipos pequeños es completamente ilimitado: después de eso, ha eliminado algunos de los elementos de [n], por lo que cada secuencia que ordene debe ser disjunta de las anteriores. Por lo tanto, parece difícil reducir el trabajo de clasificación.
David Eppstein

O(k)O(n+k)

Ω(n)DnO(k)
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.