¿Cuáles son algunas de las estructuras de datos / algoritmos de clasificación más interesantes?

Clasificación : encuentro que la clasificación de Radix es la más interesante porque puede clasificarse en un tiempo casi lineal. En los días anteriores a los algoritmos de clasificación enlatados que ahora puede obtener en varias bibliotecas, y antes del advenimiento de las bases de datos, tuve que ordenar los archivos llenos de datos de fila en lo que sería para nuestros estándares una máquina muy lenta.

Inicialmente, utilicé el tipo de burbuja que era el más fácil de implementar, pero también uno de los algoritmos de clasificación más lentos posibles. A veces tomaba media hora hacer el tipo.

Entonces se me ocurrió cómo acelerar las cosas tremendamente: creando “cubos” para las entradas indexadas por el primer carácter en la línea para ordenar esas cadenas. Luego, para aquellos cubos con múltiples cadenas, cree subgrupos y divídalos usando el segundo carácter como índice, etc.

El tiempo de clasificación pasó de 30 minutos a menos de 30 segundos. Todos estaban asombrados de cómo logré acelerar las cosas tanto. No estoy seguro de si lo leí en alguna parte o lo reinventé de la nada, pero luego descubrí que había hecho una variante del tipo Radix , el más rápido de todos.

Los datos eran ASCII en aquel entonces. El mundo UTF-8 de hoy requeriría algunas modificaciones para lidiar con los diversos problemas de secuencia de clasificación. Pero hoy, simplemente usarías algo de una biblioteca y ni siquiera pensarías mucho en ello. O incluso más fácil: simplemente canalice el archivo a través del comando de clasificación en Linux. Hecho.

Estructuras de datos : hay todo tipo de estructuras de datos. Por desgracia, los idiomas de nivel superior de hoy en día han eliminado la diversión de crear algunos de los más elaborados.

Depende de la naturaleza del problema que esté tratando de resolver qué estructura de datos utiliza. El más común, prácticamente invisible en estos días, es la pila . (Casi) todas las computadoras modernas usan pilas para manejar funciones que llaman a otras funciones, y en ese caso, esas pilas tendrán marcos de pila para que la función pueda pegar variables en las que está trabajando allí temporalmente. Somos poco conscientes de ello utilizando lenguajes de alto nivel que ocultan todos los detalles finos. Si está utilizando C , es mucho más consciente de ello.

Los árboles siempre son divertidos, y atraviesan los árboles aún más. El análisis generalmente usa árboles para analizar las declaraciones. XML y HTML tienen básicamente estructuras de árbol implícitas en su sintaxis. Los compiladores usan árboles de análisis todo el tiempo. Es posible que haya oído hablar del árbol de sintaxis abstracta , por ejemplo.

En mis días en C , implementaba listas doblemente vinculadas todo el tiempo, y enfoques muy inteligentes para hacer las inserciones y eliminaciones en dicha lista. Si se hace correctamente, dependiendo de la arquitectura, estos enfoques podrían incluso funcionar con múltiples hilos sin bloqueo, pero eso fue en máquinas de un solo núcleo. No estoy tan seguro de que esos trucos funcionen hoy en plataformas multinúcleo sin un pequeño bloqueo.

Lo que he descrito aquí es bastante básico y ubicuo . Los encuentro interesantes porque se usan prácticamente todo el tiempo . Puede, por supuesto, tener estructuras de datos más “esotéricas”, pero luego está hablando de espacios de problemas altamente especializados. Si está haciendo un tablero de juego para, por ejemplo, algún tipo de juego estratégico o de tipo RPG , tendría una estructura de datos de cuadrícula que modelaría, por ejemplo, un diseño hexagonal . Y hay trucos inteligentes que también puedes jugar allí. Podría salirse con la suya, por ejemplo, utilizando un diseño de cuadrícula cartesiana normal. Pero lo dejaré como un ejercicio para el estudiante.

Interesante es subjetivo. La importancia se puede juzgar por la frecuencia con la que surgen en la práctica. A continuación hay una guía aproximada de las cosas que surgen mucho.

Estructuras de datos:

  • Matrices – bloque de construcción básico
  • Vectores (matrices de cultivo): inserciones de tiempo constante amortizadas.
  • Hashtable: inserciones y búsquedas de tiempo “constante”
  • Conjuntos y mapas ordenados – Árboles (equilibrado: AVL / RojoBlack / B-Trees) – inserciones y búsquedas de tiempo logarítmico. Tiempo lineal ordenado transversal.
  • Heap Tree: útil para tipos parciales y fusiones de muchas formas
  • RadixTree – IntMap

Algoritmos

  • Ordenar: clasificación rápida, combinación, clasificación, clasificación paralela.
  • Fusionar – zigzag
  • Profundidad Primera búsqueda / Clasificación topológica: gráficos de dependencia
  • Breadth First Search
  • Unión / Búsqueda: parece aparecer más a menudo de lo que espera.

Visualmente, me gusta Batcher impar-par mergesort.