Estructura de datos basada en comparación para encontrar elementos


34

¿Existe una estructura de datos que toma una matriz desordenada de elementos, realiza un preprocesamiento en y responde consultas: ¿hay algún elemento en la lista, cada consulta en el peor momento ?O ( n ) x O ( log n )nO(n)xO(logn)

Realmente creo que no hay, así que una prueba de que no hay ninguno también es bienvenida


3
(1) No sé por qué puede decir "Por supuesto que considero el tiempo esperado", porque no dice "esperado" en su pregunta. Por favor, intente afirmar su pregunta con más precisión antes de decir (2) Por favor, defina “por supuesto.” “No hashable.”
Tsuyoshi Ito

2
(1) Ya veo. Gracias por la explicación. Si alguien pregunta "¿Te importa el tiempo de ejecución?", Entonces la respuesta sería "por supuesto" :) (2) Creo que "la única acción permitida es comparar dos valores en la lista" es mucho más precisa que simplemente decir "no hashable". ¿Puede editar la pregunta para que las personas no tengan que leer los comentarios para entender lo que significa "no hashable"?
Tsuyoshi Ito

3
Por cierto, si no puedes probarlo, ¿por qué sabes que es imposible? Si se trata de un ejercicio en un libro de texto o una clase, está preguntando en un sitio web incorrecto.
Tsuyoshi Ito

66
¿Es esta su pregunta? ¿Existe una estructura de datos que tome una matriz desordenada de n elementos, realice el preprocesamiento en O (n) y responda consultas: ¿hay algún elemento x en la lista, cada consulta en el peor momento O (log n)?
sdcvvc

2
@Filip: ¿Es fácil de ver? Si es cierto, entonces estoy de acuerdo en que resuelve la pregunta.
Tsuyoshi Ito

Respuestas:


30

Aquí hay una prueba de que es imposible. Suponga que puede construir una estructura de datos de este tipo. Constrúyelo. Luego elija n/logn elementos al azar de la lista, agregue ϵ a cada uno de ellos, donde ϵ es menor que la diferencia entre dos elementos en la lista, y realice las consultas para verificar si alguno de los elementos resultantes está en el lista. Ha realizado consultas O(n) hasta ahora.

Me gustaría afirmar que las comparaciones que ha realizado son suficientes para determinar si un elemento en la lista original es menor o mayor que cualquier elemento nuevo b . Supongamos que no pudieras decirlo. Entonces, debido a que este es un modelo basado en la comparación, no sabría si a era igual a b o no, una contradicción de la suposición de que su estructura de datos funciona.abab

Ahora, dado que los elementos que eligió fueron aleatorios, sus comparaciones con alta probabilidad han dado suficiente información para dividir la lista original en n / log n listas cada una de tamaño O ( log n ) . Al ordenar cada una de estas listas, obtienes un algoritmo de ordenación aleatorio de tiempo O ( n log log n ) basado únicamente en comparaciones, una contradicción.n/lognn/lognO(logn)O(nloglogn)


Algunos consejos para ayudar a comprender la prueba (suponiendo que yo mismo lo entiendo correctamente, por supuesto): los elementos deben ser completados por los elementos después de que se les haya agregado ϵ ; las garantías modelo de comparación que saben cuáles de los casos un b y un b bodegas; las listas n / log n están en 'orden ascendente': cada elemento en cualquier lista superior es más alto que cada elemento en cualquier lista inferior; después de las consultas originales, tiene suficiente información para hacer las listas alrededor de los elementos que eligió al azar,bϵunasiunasinorte/ /Iniciar sesiónnorte
Alex ten Brink

(continuación) tenga en cuenta que ni siquiera tiene que poder construir explícitamente la lista en el tiempo proporcionado para que la prueba se mantenga.
Alex ten Brink

No entiendo esta prueba en silencio. La contradicción final es "algoritmo basado únicamente en comparaciones", pero en los primeros pasos de nuestro algoritmo agregamos a cada elemento (además, "donde ϵ es más pequeño que la diferencia entre dos elementos en la lista"). ¿Por qué seguimos justificando que nuestro algoritmo todavía solo se basa en la comparación si asumimos que nuestros artículos tienen un orden total no discreto? ϵϵ
Artem Kaznatcheev

55
@Artem: Su entrada original se compone de elementos . Luego construyes un nuevo conjunto X = X × { 0 , 1 } ; usted representa una x X original como ( x , 0 ) X y una x + ϵ modificada como ( x , 1 ) X . Ahora usa el algoritmo de caja negra; el algoritmo compara elementos de X 'XXX=X×{0 0,1}XX(X,0 0)XX+ϵ(X,1)XXel uno al otro; Para responder a estas consultas, solo necesita comparar un número constante de elementos de entre sí. Por lo tanto, todo debería ser factible en el modelo de comparación, con una sobrecarga constante. X
Jukka Suomela

1
@Aryabhata: lo hace. ¿Qué es el algoritmo ? O(Iniciar sesión2norte)
Peter Shor el

24

Creo que aquí hay una prueba diferente, que demuestra la imposibilidad de una estructura de tiempo de consulta , con preprocesamiento O ( n ) .O(Iniciar sesiónknorte)O(norte)

Suponga que en el preprocesamiento realiza comparaciones , lo que lleva a un orden parcial.O(norte)

Ahora considere el tamaño del antichain más grande en eso. Dado que estos elementos no son comparables, para que tengamos un algoritmo de consulta O ( log k n ) , debemos tener que A = O ( log k n ) .UNAO(Iniciar sesiónknorte)UNA=O(Iniciar sesiónknorte)

Ahora, según el teorema de Dilworth, hay una partición de tamaño , en cadenas.UNA

Ahora podemos complementar el algoritmo para determinar las cadenas en la partición. Podemos determinar si dos elementos son comparables creando un gráfico dirigido de comparaciones y haciendo un análisis de accesibilidad. Esto se puede hacer sin comparaciones adicionales. Ahora solo fuerza bruta cada posible partición de tamaño para determinar si es una partición de cadenas.UNA

Una vez que tenemos las cadenas, podemos fusionarlas para obtener un algoritmo de comparación para ordenar la lista completa.O(norteIniciar sesiónIniciar sesiónnorte)


1
Esta es una buena idea. Y si pudiera mostrar que la partición de la cadena debe ser conocida por el algoritmo, entonces podría usar mergesort para mostrar que solo se necesitarían comparaciones adicionales de O (n log log n) para ordenar toda la entrada, en lugar de usar Jensen. Pero hay un problema: ¿por qué el algoritmo de preprocesamiento debe construir una partición en cadena? Debe existir una partición en cadena, sí, pero eso es muy diferente de lo que el algoritmo conoce.
David Eppstein el

8
Ok, ahora creo en esta prueba. Y muestra con mayor firmeza que para lograr el tiempo de consulta de Polylog, debe utilizar una serie de comparaciones que se encuentran dentro de un aditivo de clasificación. Agradable. Por cierto, la partición de la cadena se puede encontrar en tiempo polinómico a partir del conjunto de comparaciones ya realizadas, en lugar de necesitar una búsqueda de fuerza bruta, pero eso no hace ninguna diferencia para su argumento. O(nloglogn)
David Eppstein el

66
Las pruebas realmente muestran que debe tener un preprocesamiento o Ω ( n ) para cada consulta. Por supuesto, ambos son apretados. Esto muestra que la búsqueda binaria y la búsqueda lineal son los únicos algoritmos de búsqueda "interesantes" (al menos en el mundo clásico). Ω(norteIniciar sesiónnorte)Ω(norte)
Yuval Filmus

1
@Yuval: tal vez deberías escribir esta observación como una respuesta real, porque me parece que tienes que hacer una cantidad moderada de trabajo para obtener el resultado anterior de las pruebas en las respuestas.
Peter Shor

1
@Yuval: pensamiento acerca de las pruebas, solamente veo que usted debe tener ya sea el procesamiento previo o Ω ( n 1 - ε ) tiempo de consulta para todos ε . Es posible tener tiempo de preprocesamiento o ( n log n ) y tiempo de consulta O ( n / log n ) . Se puede dividir la lista en log n listas de tamaño n / log n cada una en el tiempo θ ( nΩ(norteIniciar sesiónnorte)Ω(norte1-ϵ)ϵo(norteIniciar sesiónnorte)O(norte/ /Iniciar sesiónnorte)Iniciar sesiónnortenorte/ /Iniciar sesiónnorte usando la búsqueda repetida de mediana. θ(norteIniciar sesiónIniciar sesiónnorte)
Peter Shor

0

Como señala la respuesta de Peter Shor, para descartar la membresía en un modelo basado en la comparación, necesitamos saber cómo se compara el elemento con cada miembro. Por lo tanto, utilizando consultas aleatorias (el número de miembros más pequeños que el no miembro consultado es aleatorio), obtenemos información Θ ( n log k ) en relación con tener n valores no ordenados. Por lo tanto, para alguna constante c > 0 , usando ck<norteΘ(norteIniciar sesiónk)nortedo>0 0 preprocesamiento, no podemos tenercdonorteIniciar sesiónk costo de consulta. Esto es óptimo hasta un factor constante, ya que podemos clasificar los datos en k = k / log k n / log n cubos aproximadamente iguales (cada cubo sin clasificar) en O ( n log k ) = O ( n log k ) tiempo, que permite elcosto de consulta O ( n / k ) .donorteIniciar sesiónk/ /kk=k/ /Iniciar sesiónknorte/ /Iniciar sesiónnorteO(norteIniciar sesiónk)=O(norteIniciar sesiónk)O(norte/ /k)

En particular, usando el preprocesamiento , no podemos tener un costo de consulta o ( n ) . Además, el preprocesamiento de o ( n log n ) corresponde a k en O ( n ε ) por cada ε > 0 y, por lo tanto, el costo de consulta de Ω ( n 1 - ε ) .O(norte)o(norte)o(norteIniciar sesiónnorte)kO(norteε)ε>0 0Ω(norte1-ε)

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.