¿Cuál es la estructura de árbol más eficiente para crear un índice para un almacén en memoria?

Volviendo a responder esta pregunta, ya que me perdí parte de la pregunta anterior. Resolví problemas similares mientras trabajaba para la búsqueda de eBay. Necesitábamos estructuras eficientes de CPU y memoria. Escribimos en C, no usamos STL, raramente usamos punteros e implementamos todas las estructuras de datos nosotros mismos, contando cada byte.

Una solución a su problema es la siguiente:
1. Si desea acceso O (1) en la búsqueda de claves y siempre buscará la clave completa utilizando una coincidencia exacta (por ejemplo, key = “foo”), considere implementar una tabla hash de dirección abierta para su índice. Esta tabla hash no utiliza una lista enlazada encadenada por cubo. Almacena los datos en la matriz de cubetas y, por lo tanto, evita el desperdicio de memoria en los punteros de dirección de 64 bits (si está ejecutando en un sistema operativo de 64 bits) utilizado en listas vinculadas.
2. Además, considere almacenar todos sus objetos en una gran cantidad de memoria contigua que controle. De esta manera, el valor del índice será solo un entero sin signo o representará un desplazamiento largo al inicio de su objeto en su losa. Básicamente, implementará su propio asignador de memoria.

Si necesita tipos de búsqueda más sofisticados, como escaneos de rango o coincidencia de cadenas difusas, necesitaría un gráfico o árbol de palabras. También hay algunas opciones para ellos. Por ejemplo, puede usar un gráfico de palabras acíclicas dirigido. Esto es esencialmente un gráfico de prefijo + sufijo muy compacto de memoria, almacenado como una matriz. Es posible implementar escaneos y editar consultas de distancia en su contra.

Suponiendo que desea una estructura similar a un árbol (es decir, necesita resolver el problema del diccionario “extendido”), las estructuras disponibles para usted son árboles equilibrados y listas de omisión.

El árbol rojo negro será la estructura más eficiente para resolver el “problema extendido del diccionario”. Las invariantes, impuestas por rotaciones, garantizan inserciones, búsqueda y eliminación de O (log n), independientemente del orden en que se insertan los datos en el árbol. Creo que varias bases de datos ofrecen la opción de un índice de árbol rojo-negro en memoria.

Las listas de omisión son las más fáciles de implementar y razonar. Doug Lea también creó una excelente implementación concurrente de la lista de omisión, que viene como una parte estándar de Java. Son una estructura de datos aleatoria: el peor tiempo de búsqueda es O (N), pero el tiempo promedio de inserción y eliminación es O (lg n). El otro inconveniente de las listas de omisión es que cada nodo en una lista de omisión contiene punteros log_2 (bits en una palabra). En una máquina de 64 bits, eso significa que tiene 64 bytes adicionales (8 palabras, 8 bytes por palabra) por entrada. Memtables (usado en BigTable, leveldb, HBase y Cassandra para índices en memoria) usan listas de omisión.

Si las claves son cadena. Luego usa trie.
http://en.wikipedia.org/wiki/Trie

More Interesting

¿Alguien puede explicar la solución del problema LabelMaker de Hacker Cup de Facebook?

¿Cuál es el algoritmo más conocido para unir varias tablas (> 5) que contienen uniones externas (en una base de datos no Oracle) implementadas a través de un lenguaje programático?

¿Es una persona inteligente debido a los 'algoritmos' que usa su cerebro? Si es así, ¿alguien podría copiar ese 'algoritmo' para ser igualmente inteligente?

¿Cuál es la complejidad temporal de la solución del problema del vendedor ambulante mediante la optimización de colonias de hormigas?

Cómo implementar un código C para la eliminación de un nodo de una lista vinculada considerando todos los casos de prueba

¿Se puede implementar BFS sin usar una cola? En caso afirmativo, ¿cuál es la mejor complejidad que se puede lograr?

¿Qué prueba de primalidad se usa en las aplicaciones de software convencionales?

¿Es posible el algoritmo de compresión que se muestra en Silicon Valley en realidad?

¿Cómo empiezo a aprender o fortalecer mi conocimiento de las estructuras de datos y algoritmos?

Cómo encontrar el subconjunto contiguo de suma máxima utilizando un método de divide y vencerás

¿Cuáles son algunas aplicaciones del mundo real en las que es útil el aprendizaje incremental de algoritmos (aprendizaje automático)? ¿Se prefieren las SVM para tales aplicaciones?

¿Qué es un árbol de expansión?

¿Qué algoritmos y estructuras de datos debo aprender para ZCO e INOI?

¿Cómo funcionan los algoritmos de procesamiento de cadenas en CUDA?

Cómo analizar el código para encontrar la complejidad del algoritmo