¿Cuáles son las ventajas de los árboles binarios de búsqueda más tablas hash?
Las tablas hash puede buscar cualquier elemento en Theta (1) tiempo y es tan fácil de añadir un elemento .... pero no estoy seguro de las ventajas que van al revés.
¿Cuáles son las ventajas de los árboles binarios de búsqueda más tablas hash?
Las tablas hash puede buscar cualquier elemento en Theta (1) tiempo y es tan fácil de añadir un elemento .... pero no estoy seguro de las ventajas que van al revés.
Una "ventaja" de un árbol binario es que puede ser atravesada a la lista de todos los elementos en orden. Esto no es imposible con una tabla hash, pero no es una operación normal de un diseño en una estructura de hash.
Una tabla hash ocuparía más espacio cuando se crea por primera vez - que tendrá espacios disponibles para los elementos que aún no se han insertado (ya sea que estén o no alguna vez insertados), un árbol de búsqueda binaria sólo será tan grande como lo necesita ser. Además, cuando una tabla hash necesita más espacio, ampliando a otra estructura podría llevar mucho tiempo, pero que podría depender de la aplicación.
Recuerde que los árboles de búsqueda binaria (basados referencia) presentan memoria eficiente. No se reservan más memoria de lo que necesitan.
Por ejemplo, si una función hash tiene un rango R(h) = 0...100, entonces usted necesita para asignar una matriz de elementos 100 (punteros-a), incluso si son sólo de hash 20 elementos. Si se va a utilizar un árbol de búsqueda binaria para almacenar la misma información, sólo se asigna todo el espacio que usted necesita, así como algunos metadatos sobre enlaces.
Un árbol binario es más lento para buscar e insertar en, pero tiene la característica muy interesante del recorrido infija que esencialmente significa que se puede repetir por los nodos del árbol en una forma ordenada.
Iteración a través de las entradas de una tabla hash simplemente no tiene mucho sentido, ya que están esparcidos en la memoria.
Un árbol de búsqueda binaria puede ser implementado con un persistente interfaz, donde se devuelve un nuevo árbol, pero el árbol viejo sigue existiendo. Implementado con cuidado, los árboles viejos y nuevos comparte la mayoría de sus nodos. No se puede hacer esto con una tabla hash estándar.
Las principales ventajas de un árbol binario sobre una tabla hash es que el árbol binario le da dos operaciones adicionales que no se puede hacer (fácil, rápida) con una tabla hash
encontrar el elemento más cercano a (no necesariamente igual a) un valor clave arbitraria (o más cercano por encima / debajo)
repetir el contenido del árbol ordenadamante
Los dos están conectados - el árbol binario mantiene su contenido en una forma ordenada, así que las cosas que requieren que el orden de clasificación son fáciles de hacer.
A (equilibrada) árbol binario de búsqueda también tiene la ventaja de que su complejidad asintótica es en realidad un límite superior, mientras que los tiempos de "constantes" para las tablas hash son tiempos amortizados: Si usted tiene una función hash inadecuada, que podría terminar degradante para el tiempo lineal , en lugar de constante.
Si desea acceder a los datos de una manera ordenada, a continuación, una lista ordenada tiene que ser mantenido en paralelo a la tabla hash. Un buen ejemplo es Diccionario en .NET. (ver http://msdn.microsoft.com/en-us/library/3fcwy8h6.aspx ).
Esto tiene el efecto secundario de inserciones no sólo la desaceleración, pero consume una mayor cantidad de memoria que un árbol b.
Además, puesto que se ordena un árbol B, es fácil de encontrar rangos de resultados, o para realizar uniones o fusiones.
Además de todos los otros buenos comentarios:
Las tablas hash en general tienen un mejor comportamiento de la caché que requiere menos memoria lee en comparación con un árbol binario. Para ver una tabla hash que normalmente sólo se incurrirá en una sola lectura antes de tener acceso a una retención de referencia de los datos. El árbol binario, si se trata de una variante equilibrada, requiere algo en el orden de k * lg (n) de memoria lee por alguna constante k.
Por otro lado, si un enemigo conoce su función de troceado que el enemigo pueda hacer cumplir su tabla hash para hacer colisiones, lo que dificulta enormemente su rendimiento. La solución es elegir la función de troceado al azar de una familia, pero un BST no tiene esta desventaja. Además, cuando la presión tabla hash crece demasiado, que a menudo tienden a enlargen y reasignar la tabla hash que puede ser una operación costosa. El BST tiene un comportamiento más simple aquí y no tiende a asignar repente una gran cantidad de datos y realizar una operación de refrito.
Los árboles tienden a ser la estructura de datos promedio final. Pueden actuar como listas, puede ser fácilmente dividido para funcionamiento en paralelo, tienen una eliminación rápida, inserción y búsqueda en el orden de O (lg n) . No hacen nada particularmente bien, pero no tienen ningún comportamiento excesivamente mal.
Por último, BSTs son mucho más fáciles de implementar en (puros) lenguajes funcionales en comparación con tablas hash y que no requieren cambios destructivos que se ejecutarán (la persistencia de argumentos de Pascal arriba).
principal ventaja de la tabla hash es que lo hace casi todas las operaciones en ~ = O (1). Y es muy fácil de entender y aplicar. Lo hace resolver muchos problemas "entrevista" de manera eficiente. Así que si quieres romper una entrevista codificación, hacer el mejor amigo de tabla hash ;-)
BSTs también ofrecen la "findPredecessor" y "operaciones findSuccessor" (Para encontrar los siguientes elementos más pequeños y más grandes al lado) en tiempo O (log n), que también podría ser operaciones muy práctico. Tabla Hash no puede proporcionar en ese tiempo la eficiencia.
También depende de la utilización, Hash permite localizar coincidencia exacta. Si desea consultar para una gama continuación BST es la elección. Suponga que tiene una gran cantidad de datos E1, E2, E3 ..... es.
Con tabla hash puede localizar cualquier elemento en un tiempo constante.
Si desea encontrar los valores de rango superior a e41 y menos del e8, BST puede encontrar rápidamente que.
La clave es la función hash utilizado para evitar una colisión. Por supuesto, no podemos evitar totalmente una colisión, en cuyo caso se recurre al encadenamiento u otros métodos. Esto hace que ya no la recuperación constante de tiempo en el peor de los casos.
Una vez lleno, tabla hash tiene que aumentar su tamaño cubo y copiar todos los elementos de nuevo. Esto es un coste adicional no presentar más de BST.
Una de las ventajas que nadie más ha señalado que es árbol binario de búsqueda le permite hacer búsquedas por rango de manera eficiente.
Con el fin de ilustrar mi idea, yo quiero hacer un caso extremo. Digamos que quiere obtener todos los elementos cuyas claves sean entre 0 y 5000. Y en realidad sólo hay uno de esos elementos y otros elementos de 10000 cuyas claves no están en el rango. BST puede hacer búsquedas por rango de forma eficiente ya que no busca un subárbol que es imposible tener la respuesta.
Si bien, ¿cómo se puede hacer búsquedas por rango en una tabla hash? O lo que tenga que repetir cada espacio de cubo, que es O (n), o si tiene que buscar si cada uno de 1,2,3,4 ... hasta 5000 existe. (¿Qué pasa con las teclas entre 0 y 5000 son un conjunto infinito? Teclas de ejemplo se puede decimales)
Una tabla hash es una estructura de datos desordenada, el diseño de un teléfono celular, que desea mantener tantos datos como sea posible disponible para el almacenamiento de datos. Una tabla hash es una estructura de datos desordenada - lo que significa que no mantiene sus elementos en un orden particular. Por lo tanto, si se utiliza una tabla hash para un libro de direcciones del teléfono celular, entonces usted necesita memoria adicional para ordenar los valores ya que sin duda necesita para mostrar los valores en orden alfabético - es una libreta de direcciones después de todo. Así, mediante el uso de una tabla hash que tiene que dejar de lado la memoria para ordenar elementos que de otro modo se puede utilizar como espacio de almacenamiento. Pero árbol binario de búsqueda es un conjunto de datos ordenados structure.Because un árbol binario de búsqueda ya está ordenado, no habrá necesidad de perder los registros de memoria o la clasificación de tiempo de procesamiento en un teléfono celular. Como hemos mencionado anteriormente, haciendo una búsqueda o una inserción en un árbol binario es más lento que hacerlo con una tabla hash, pero un libro de direcciones del teléfono celular casi nunca tienen más de 5.000 entradas. Con un pequeño número de entradas de este tipo, O de un árbol de búsqueda binaria (log (n)) será sin duda lo suficientemente rápido. Por lo tanto, teniendo en cuenta toda esa información, un árbol de búsqueda binaria es la estructura de datos que puedes usar en este escenario, ya que es una opción mejor que una tabla hash.
Las tablas hash no son buenas para la indexación. Cuando se está en busca de un rango, BSTs son mejores. Esa es la razón por la cual la mayoría de los índices de base de datos utilizan árboles + B en lugar de tablas hash
De Cracking the Entrevista Codificar, 6ª Edición
Podemos aplicar la tabla hash con un árbol binario de búsqueda equilibrado (BST). Esto nos da un O (log n) tiempo de búsqueda. La ventaja de esto es potencialmente usando menos espacio, puesto que ya no asignar una gran matriz. También podemos iterar a través de las teclas en orden, que puede ser útil a veces.
Las clases hashset y de mesa son conjuntos no ordenados. No es obvio a partir de la interfaz (y podría ser de otra manera), pero las tablas hash se han implementado utilizando AVL árboles. Esto significa que el código hash no se reduce por el modulo de una matriz (menos colisiones) y también significa que no hay rehashing de una matriz para hacer (rendimiento más suave). El hecho de que son colecciones desordenadas significa que sólo proporciona una función y una función es igual a hashCode - no un comparador completo como para los árboles. Así que si se utiliza una tabla tabla hash <K, T> o un árbol binario árbol <K, T> depende de la clase K - si es totalmente comparable o sólo la igualdad comparables.
Hay ocasiones en que el tipo de datos es a la vez comparable y la igualdad comparables - como cadena. Esto significa que HashSet <String> y ajuste <String> son posibles. Las búsquedas en un conjunto hash de cadenas tienden a ser alrededor de 10 veces más rápido que búsquedas en un conjunto ordenado de cuerdas. Si la comparación es caro, entonces los árboles más lento en comparación con tablas hash. Si la comparación es rápido, (al igual que para los enteros y los flotadores), entonces los árboles se ejecutarán más rápido que las tablas hash.
Un HashMap es un conjunto matriz asociativa. Por lo tanto, la matriz de valores de entrada se agruparon en los cubos. En un esquema de direccionamiento abierto, tiene un puntero a un cubo, y cada vez que se agrega un nuevo valor en un cubo, a averiguar en qué parte del cubo hay espacios libres. Hay algunas maneras de hacer esto: se inicia al comienzo de la cuchara y el incremento del puntero cada vez y probar si su ocupada. Esto se llama el sondeo lineal. A continuación, puede hacer una búsqueda binaria como complemento, en el que el doble de la diferencia entre el comienzo de la cubeta y en el que el doble hacia arriba o hacia abajo cada vez que está en busca de un espacio libre. Esto se llama cuadrática de sondeo. DE ACUERDO. Ahora los problemas en estos dos métodos es que si la cubeta se desborda en los próximos cubos dirección, entonces usted necesita a-
DE ACUERDO. pero si se utiliza un LinkedList no debería ser un problema tal derecho? Sí, en las listas enlazadas usted no tiene este problema. Teniendo en cuenta cada cubo para comenzar con una lista enlazada, y si usted tiene 100 elementos en un cubo que se requiere para atravesar esos 100 elementos para llegar al final de la Lista enlazada por lo tanto el List.add (Elemento E) se llevará a a- tiempo
La ventaja de la aplicación LinkedList es que no se necesita la operación de asignación de memoria y O (N) de transferencia / copia de todos los cubos como en el caso de la aplicación direccionamiento abierto.
Por lo tanto, la manera de reducir al mínimo la corriente de trabajo (N) es la de convertir la aplicación a la de un árbol de búsqueda binaria, donde encontrar las operaciones son O (log (n)) y se agrega el elemento en su posición en base a su valor. La característica añadida de una BST es que viene ordenadas!
Árboles binarios de búsqueda son una buena opción para implementar el diccionario si las teclas tienen alguna orden total (teclas son comparables) definida en ellos y que quieren preservar la información del pedido.
Como BST conserva la información del pedido, que le provee de cuatro operaciones de conexión dinámicos que no pueden ser realizadas (eficientemente) usando tablas hash. Estas operaciones son:
Todas estas operaciones como cada operación BST tienen tiempo de complejidad O (H). Asimismo, todas las claves almacenadas permanecen ordenados en el BST lo que le permite obtener la secuencia ordenada de las teclas sólo por la que atraviesa el árbol en el in-orden.
En resumen, si lo que quieres es operaciones de inserción, borrado y eliminar a continuación, la tabla hash es inmejorable (la mayor parte del tiempo) en el rendimiento. Pero si quieres cualquiera o todas las operaciones mencionados anteriormente debe utilizar un BST, preferiblemente un BST auto-equilibrio.
Árboles binarios de búsqueda puede ser más rápido cuando se utiliza con claves de cadena. Especialmente cuando las cadenas son largas.
Árboles binarios de búsqueda utilizando comparaciones por menos / más rápido para los que son cadenas (cuando no son iguales). Por lo que un BST puede responder rápidamente cuando no se encuentra una cadena. Cuando se ha encontrado que tendrá que hacer sólo una comparación completa.
En una tabla hash. Es necesario para calcular el hash de la cadena y esto significa que tiene que ir a través de todos los bytes al menos una vez para calcular el hash. Por otra parte, cuando se encuentra una entrada coincidente.