2010-07-16 24 views
12

Tengo curiosidad por saber cuál es el razonamiento que podría sopesar el uso de una técnica de árbol de autoequilibrado para almacenar elementos que utilizando una tabla hash.Tablas hash v árboles de búsqueda de autoequilibrado

Veo que las tablas hash no pueden mantener el orden de inserción, pero siempre pude usar una lista vinculada en la parte superior para almacenar la secuencia de orden de inserción.

Veo que para un número pequeño de valores, hay un costo adicional de la función hash, pero siempre puedo guardar la función hash junto con la clave para búsquedas más rápidas.

entiendo que las tablas hash son difíciles de implementar que la aplicación recta de avance de un árbol rojo-negro, pero en una implementación práctica no sería uno estar dispuesto a ir un poco más allá de la molestia?

Veo que con las tablas hash es normal que se produzcan colisiones, pero con técnicas de direccionamiento abierto como el doble hash que permiten guardar las claves en la tabla hash, el problema no se ha reducido al efecto de ¿No inclinar el favor hacia los árboles negros rojos para tales implementaciones?

Tengo curiosidad si me falta una desventaja estricta de la tabla hash que todavía hace que los árboles negros rojos sean una estructura de datos bastante viable en aplicaciones prácticas (como sistemas de archivos, etc.).

+2

ambas estructuras de datos tienen pros y contras. Debe elegir el que mejor se adapte a su problema. –

Respuesta

13

Esto es lo que ocurre:

  1. Hay tipos de datos que no pueden ser hash (o es demasiado cara para discutir a fondo), por lo tanto, no se puede almacenar en tablas hash.
  2. árboles guardan los datos en el orden que necesita (clasificados), y no de orden de inserción. No puede (efectivamente) hacer eso con la tabla hash, incluso si ejecuta una lista vinculada a través de ella.
  3. Los árboles tienen una mejor performace peor de los casos
+0

1. Si no puede generar una clave hash, ¿cómo se produce una clave para determinar dónde se coloca el nodo en el árbol? Si puede generar una clave para la ubicación del nodo, ¿por qué no puede usarla para la clave hash? 2. ¿Por qué no puedes hacer esto de manera efectiva con una tabla hash + lista vinculada? ¿Puedes dar más explicaciones? Recuerde que una lista vinculada es esencialmente solo un árbol optimizado para ordenar. 3. Los árboles tienen un mejor caso de registro (N). Hashing siempre es constante. Las colisiones tienen el mismo efecto en ambas estructuras. ¿Cómo pueden los árboles tener un mejor desempeño en el peor de los casos? – Jake

+2

@Jake 1- comparando elementos. Tener orden en algo no significa que puedas hacer algo. 2- Porque 3- No hay nada para colisionar en los árboles. – unbeli

+0

1. El artículo que está comparando es la clave. Todos los datos binarios se pueden calcular mediante hash mediante algún método, y todos los datos en una computadora son datos binarios. Supongo que podría ser costoso si las teclas son enormes, pero eso probablemente tendría el mismo efecto en la función de comparación del árbol. 3. Los árboles de búsqueda tienen nodos ordenados. Solo puede pedir una lista si la lista tiene un conjunto de claves en alguna forma para ordenar los elementos. Si dos nodos tienen la misma clave, eso es una colisión. – Jake

0

En mi humilde opinión, los árboles que se equilibran a sí mismos funcionan bastante bien como temas académicos. E I no sé nada que pueda calificarse como "implementación directa de un árbol rojo-negro ".

En la vida real, la pared de memoria los hace mucho menos eficientes que en papel.

Con esto en mente, tablas hash son alternativas decentes, especialmente si usted no practica ellos el estilo académico (olvidarse de la restricción de tamaño de la tabla y que mágicamente resolver cambiar el tamaño de la tabla de emisión y casi todos los problemas de colisión).

En una palabra: que sea sencillo. Si eso es simple para usted, entonces es simple para su computadora.

+1

¿Podría explicarnos cómo puede "olvidarse del tamaño de la tabla contraint"? ¿Estás sugiriendo que lo ignoremos, o quieres decir algo más? – Odrade

+0

¿Considera la implementación de la biblioteca estándar de C++ como un tema académico? ¿o el de los contenedores Java y .NET? Para que lo sepas, std :: map se implementa principalmente como un árbol de búsqueda binaria equilibrado; y gnu libstdC++ implementa std :: map como un árbol rojo y negro, IIRC. – Fingolfin

+0

"manténgalo simple. Si eso es simple para usted, entonces eso es simple para su computadora". Ese no es un buen consejo, piense en Fibonacci Heap: muy complejo y muy eficiente. Lo mismo ocurre, por ejemplo, con la búsqueda de árbol de juegos SSS * o la búsqueda de rutas de Thorup ... – PawelP

5

asignación de almacenamiento es otra consideración. Cada vez que llena todos los cubos en una tabla hash, necesita asignar nuevo almacenamiento y volver a manipular todo. Esto puede evitarse si conoce el tamaño de los datos con anticipación. Por otro lado, los árboles equilibrados no sufren este problema en absoluto.

+0

pero el costo amortizado de la operación sigue siendo O (1), ¿realmente cree que es una desventaja? –

+1

En la mayoría de los casos, probablemente no. En aplicaciones en tiempo real, sí. – Odrade

2

sólo quería añadir:

  • árboles binarios equilibrados tienen un tiempo previsible de ir a buscar un conjunto de datos [log n] independiente del tipo de datos.Muchas veces puede ser importante para su aplicación estimar los tiempos de respuesta para su aplicación. [las tablas hash pueden tener tiempos de respuesta impredecibles]. Recuerde que para n menores, como en los casos de uso más comunes, la diferencia de rendimiento en una búsqueda en memoria difícilmente va a importar y el cuello de la botella del sistema estará en otro lugar y, a veces, solo desea hacer que el sistema sea mucho más simple. depurar y analizar

  • Los árboles son generalmente más eficiente de la memoria en comparación con tablas hash y mucho más sencillo de implementar sin ningún análisis de la distribución de claves de entrada y posibles colisiones, etc.

0

Creo que si se desea consultar para una rango de claves en lugar de una clave, la estructura de árbol auto equilibrada tendrá un mejor rendimiento que una estructura de tabla hash.

+0

Esto suena como una opinión. ¿Tiene algún dato/referencia para respaldar su estado de cuenta? – Floris

+0

Consultar un rango de claves en una tabla hash puede implicar saber exactamente dónde hay claves y dónde no. Debería repetir la operación de hashing para cada clave posible que crea que está en el intervalo de consulta. Con árboles, puede ubicar el comienzo del intervalo y luego recorrer el árbol en orden hasta el final del intervalo de consulta. – Cesar

Cuestiones relacionadas