¿Cuál es la implementación más rápida del árbol de búsqueda binario? (auto-equilibrio)

Puede mejorar std :: map para que funcione mucho más rápido, simplemente, desde el exterior.

Una de las grandes penalizaciones de rendimiento de std :: map es su diseño de memoria, donde cada nodo se ubica aleatoriamente en el montón. Esta ubicación aleatoria de los nodos causa demasiados errores de caché y consecuentes accesos a la memoria, que son la parte más lenta en una CPU moderna. Otro potencial de desaceleración son las operaciones de almacenamiento dinámico.

Afortunadamente, es bastante trivial evitar la mayoría de las operaciones de almacenamiento dinámico, en su std :: map. Como notará std::map tiene un parámetro Allocator, que por defecto es std::allocator . Todo lo que tiene que hacer es escribir su propio asignador que asignará una gran parte de la memoria consecutiva, y lo dividirá en una lista de bloques más pequeños dimensionados con sizeof(Key) . Estos bloques formarán una lista libre, que administrará el asignador. Sospecho que fast_pool_allocator de Boost, como se describe en fast_pool_allocator, hace exactamente eso, por lo que no necesita implementarlo usted mismo. Desafortunadamente, la documentación de Boost es demasiado escasa y es imposible determinar qué hace exactamente y cómo puede afectar el diseño de la memoria (y no tengo tiempo para leer la implementación en este momento).

Último comentario : asegúrese de que realmente necesita un árbol de búsqueda binario, y no una tabla hash (std :: unordered_map) y no un B-Tree, o incluso un vector (ordenado o no). En algunos casos, estos tendrán un rendimiento mucho mejor que cualquier implementación de árbol de búsqueda binaria. ¿Por qué menciono un vector sin clasificar, cuando busco en él es O (N)? Porque si tiene solo unos pocos elementos, por ejemplo, 4, escanearlos linealmente es mucho más rápido que cualquier otra alternativa.

Yo recomendaría no reescribir su propia clase de mapa. Creo que std :: map es lo suficientemente bueno, y no hay necesidad de reinventar la rueda nuevamente. Es mejor aprender y usar el STL. Esa es básicamente la idea de la abstracción, usar lo que ya existe para nuestros propios fines.

Por otro lado, nunca está de más aprender estructuras de datos e intentar implementarlas, ya que para mí realmente disfruto estudiar y comprender cómo funcionan realmente las cosas. Puede intentar implementar su propia clase std :: map (creo que el STL usa un árbol rojo-negro), creo que sería un desafío bastante interesante y emocionante.

More Interesting

¿Qué es la representación de colas usando array?

¿Cómo funcionan los algoritmos de clasificación en un sistema distribuido grande?

¿Cómo "mira hacia adelante" un algoritmo de aprendizaje por refuerzo para saber qué acción tomar en este momento?

¿Cuál es el tipo de algoritmo de programación utilizado por WhatsApp?

¿Qué algoritmo debo usar en este problema de geometría?

Cómo comparar dos cadenas C para igualdad, usando una matriz de caracteres

Cuando se ejecuta el ordenamiento rápido aleatorio, ¿cuántas llamadas se realizan al generador de números aleatorios en el peor de los casos? ¿Y también para el mejor caso?

¿Cómo puedo calcular de manera eficiente el número de intercambios requeridos por los métodos de ordenación lenta como la ordenación por inserción y la ordenación por burbujas para ordenar una matriz determinada?

¿Cuál es el algoritmo que utilizan los ferrocarriles indios para la confirmación de un boleto de espera? ¿Cuál es la mejor manera de confirmar un boleto cuando hay una gran lista de espera?

¿Cuál es el programa de clasificación rápida que tiene su mediana como pivote?

Si llamo k veces getSuccessor () de un nodo con altura h en una búsqueda de árbol binario. ¿Cómo pruebo que el tiempo de ejecución tomará solo O (k + h)?

¿Cuál es la mejor manera de crear una estructura de datos basada en valores clave en C ++ que admita memoria compartida entre procesos usando C ++ 11?

¿Cuál es el mejor algoritmo de reconocimiento de patrones hoy?

¿Cuál es un ejemplo interesante del patrón de red del mundo pequeño?

¿Cuál es la estructura de algoritmo / datos utilizada por Lucene para calcular el término frecuencia de los documentos?