Hashing usando árboles de búsqueda en lugar de listas

11

Estoy luchando con hashing y material de árbol de búsqueda binaria. Y leí que en lugar de usar listas para almacenar entradas con los mismos valores hash, también es posible usar árboles de búsqueda binarios. Y trato de entender cuál es el tiempo de ejecución más desfavorable y más desfavorable para las operaciones

  1. insert,
  2. find y
  3. delete

vale la pena- resp. caso promedio ¿Mejoran con respecto a las listas?

Forrest Gump
fuente
Si tiene acceso a un análisis riguroso de tiempos de ejecución de tablas hash con encadenamiento lineal (es decir, listas lineales), reemplace la parte donde los costos promedio en las listas lineales se conectan con los resultados de casos promedio de una implementación equilibrada del árbol de búsqueda. El resto es mecánica. (Obviamente, ayuda.)
Raphael

Respuestas:

4

Para las listas, la inserción, la búsqueda y la eliminación están respectivamente en , , . La lista ordenada es peor. La búsqueda binaria en sí misma es para matrices ordenadas, en las cuales las operaciones están en , , . Si desea operaciones de "inserción" y "eliminación", necesita algo más que una búsqueda binaria.O(1)O(n)O(n)O(n)O(logn)O(n)

Probablemente quieras algo como árboles de búsqueda binarios . Es mucho más fácil encontrar referencias al respecto una vez que tenga la terminología adecuada. Estas operaciones se realizan en peor de los casos, por ejemplo, para las implementaciones que usan árboles AVL y árboles rojo-negros .O(logn)

jmad
fuente
1
Todo eso es correcto, pero no veo cómo responde la pregunta planteada.
rgrig
No era la misma pregunta en absoluto en el momento. (Incluso el historial de edición no tiene la pregunta original. Extraño). Podría actualizar mi respuesta, pero sería redundante con la de Gilles.
jmad
4

En el peor de los casos, si solo almacena elementos con los mismos valores hash, una tabla hash almacena cada elemento en el mismo depósito. Si usa listas para almacenar los elementos de un depósito, entonces la búsqueda es en el peor de los casos (donde es el número de elementos en la tabla; más generalmente, es el número de elementos en el depósito más grande), porque necesita recorrer toda la lista si está buscando un elemento que no está en la tabla. La búsqueda positiva (donde sabe que el elemento está presente) tiene la misma complejidad: necesita si está buscando el último elemento de la lista. La eliminación tiene la misma complejidad (necesitaO(n)nnn1=Θ(n)n1búsquedas si está eliminando el último elemento). La inserción también es si necesita verificar un elemento existente, u si permite duplicados (en cuyo caso puede insertar el elemento al comienzo de la lista).O(n)O(1)

Con los árboles de búsqueda binarios balanceados , la complejidad del peor de los casos se reduce a , porque la profundidad de un árbol de búsqueda balanceada crece logarítmicamente en el tamaño del árbol por definición de balance.O(logn)

Con una distribución promedio de datos, los elementos se distribuyen en diferentes categorías y hay pocas colisiones, por lo que la complejidad es cercana a independientemente de la estructura de datos utilizada en caso de colisiones.O(1)

Con búsquedas aleatorias en una distribución de datos elegida de forma contradictoria en la que todos los elementos están en el mismo grupo, la longitud promedio de la lista que debe atravesarse es , por lo que la complejidad de búsqueda promedio en esta situación es . Con un árbol, el promedio es , como en el peor de los casos.nn/2Θ(n)Θ(logn)

Gilles 'SO- deja de ser malvado'
fuente
2
"con distribución promedio de datos" debería leer "con una función hash suficientemente aleatoria"
JeffE