¿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 )
Realmente creo que no hay, así que una prueba de que no hay ninguno también es bienvenida
ds.data-structures
sorting
Chi-Lan
fuente
fuente
Respuestas:
Aquí hay una prueba de que es imposible. Suponga que puede construir una estructura de datos de este tipo. Constrúyelo. Luego elijan / lognorte 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.una si una si
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 / lognorte n / lognorte O ( logn ) O ( n logIniciar sesiónn )
fuente
Creo que aquí hay una prueba diferente, que demuestra la imposibilidad de una estructura de tiempo de consulta , con preprocesamiento O ( n ) .O ( logkn ) O ( n )
Suponga que en el preprocesamiento realiza comparaciones , lo que lleva a un orden parcial.O ( n )
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 ) .UNA O ( logkn ) A = O ( logkn )
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 ( n logIniciar sesiónn )
fuente
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 < n Θ (nlogk ) norte c > 0 preprocesamiento, no podemos tener ≤ cdon logk 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 ′ ) .≤ cn logk / k k′= k / logk ≤ n / lognorte O ( n logk′) = O ( n logk ) O ( n / 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 ( n ) o ( n ) o ( n logn ) k O ( nε) ε >0 Ω ( n1 - ε)
fuente