Construcción del autómata Aho-Corasick para coincidencia de subcadenas

El autómata Aho-Corasick es una estructura de datos que permite la coincidencia simultánea de múltiples patrones dentro de una secuencia de texto. Este artículo técnico detalla la construcción de dicho autómata a partir de un árbol de prefijos (trie), destacando su capacidad para procesar entradas e

Por qué los conjuntos y diccionarios de Python no son realmente O(1)

En Python se asume de forma generalizada que las estructuras dict y set ofrecen operaciones en tiempo constante, pero esa afirmación es un modelo simplificado, no una realidad garantizada. Un diccionario se implementa mediante una tabla hash, cuya eficiencia depende de una buena función de hash y de

Listas enlazadas intrusivas: cómo las emplea Linux para gestionar procesos

Las listas enlazadas intrusivas son una variante de las listas enlazadas en la que los punteros de enlace se embeben dentro de la propia estructura del objeto que se desea enlazar, en lugar de residir en un nodo externo que contiene un puntero a los datos. En una lista convencional cada nodo almacen

Cómo funcionan las Swiss Tables en el map nativo de Go

## Cómo funcionan las Swiss Tables en el map nativo de Go La versión 1.24 de Go, el lenguaje de programación desarrollado por Google, sustituyó la implementación interna de sus mapas (maps) por un diseño basado en Swiss Tables, una técnica de tablas hash que optimiza la velocidad de acceso a datos.

Radsort: algoritmo de ordenación paralelo con sobrecarga espacial mínima

El artículo académico 'Parallel O(√n) Overhead LSD Radix Sort', presentado por Robert Clausecker en julio de 2026, introduce Radsort, una variante optimizada del algoritmo de ordenación radix de menor a mayor (LSD). Esta técnica está diseñada para resolver la limitación de memoria de los métodos tra

Complejidad temporal de operaciones en tipos integrados de Python

La documentación oficial de CPython detalla la complejidad computacional de las operaciones sobre sus tipos de datos nativos, utilizando la notación Big O para describir cómo crece el tiempo de ejecución según el tamaño de los inputs. Este análisis es crucial para desarrollar software eficiente y pr

sync.Map en Go: del API pública a la implementación con hash trie

sync.Map es la estructura de la biblioteca estándar de Go diseñada para acceder a un mapa desde varias goroutines sin provocar carreras de datos, un problema habitual cuando un mapa normal es leído y escrito de forma concurrente. Tras explicar por qué un map[K]T corriente no es seguro ante accesos s

Nueve libros clásicos de informática recomendados por un programador

Un programador comparte una selección de nueve libros de informática que considera imprescindibles, con una breve reseña de cada uno y la razón por la que los recomienda. La lista arranca con "The Art of Computer Programming", de Donald E. Knuth, una obra densa y riquísima en ejercicios y solucione

Mejoras de tiempo de compilación en LLVM 23: del -6,75% al detalle interno

LLVM 23 reduce el tiempo de compilación un 6,75% en compilaciones -O3, con un descenso del 10,53% en el caso concreto de sqlite3, según los datos del propio proyecto. La mayor parte de la ganancia procede de tres reformas de las tablas hash que LLVM utiliza intensivamente: el paso de sondeo cuadráti

std::hive de C++26: más rápido que list, pero no reemplaza a vector

std::hive, el nuevo contenedor que incorpora el estándar C++26, ocupa un espacio intermedio entre std::vector y std::list. Como un vector, almacena sus elementos en bloques contiguos de memoria, lo que permite recorrerlos sin saltar entre punteros; como una lista, nunca mueve un elemento tras insert

Go propone nuevos tipos de colección genéricos para Go 1.28

El grupo de trabajo Go Collections ha presentado una propuesta para incorporar nuevos tipos de colección genéricos a la biblioteca estándar de Go 1.28. Formado a finales de 2025 e integrado por Jonathan Amsterdam, Alan Donovan, Robert Griesemer, Daniel Martí, Roger Peppe, Keith Randall e Ian Lance T

Mapas en Go 1.24: así funciona la migración a Swiss Tables

Los mapas son una de las estructuras de datos más usadas en cualquier programa Go no trivial: sustentan el enrutamiento de peticiones, las cachés, la deduplicación y las pipelines de agregación. Por eso, cualquier mejora interna en su implementación tiene un efecto multiplicador en sistemas reales.

Construir una cola lock-free rápida en C++ moderno desde cero

Las colas son una de las estructuras de datos más usadas en informática, y en código de un solo hilo su implementación resulta trivial: basta con std::queue en C++. La complejidad surge al pasar a entornos multihilo, donde varios hilos compiten por los mismos elementos y, si no se sincronizan correc

Cómo ajustar las codificaciones internas de Valkey para ahorrar memoria

Valkey, la base de datos en memoria, abstrae la representación real de los datos en RAM mediante codificaciones automáticas que elige según el tamaño y la cantidad de elementos. Cada tipo de dato (hashes, listas, conjuntos, conjuntos ordenados y streams) puede almacenarse con estructuras más o menos

Diccionarios y tablas en KDB/Q: guía práctica de sus tipos de datos nativos

KDB/Q incorpora de forma nativa dos estructuras de datos fundamentales, los diccionarios y las tablas, que en lenguajes como Java requieren construcciones alternativas como HashMap o ArrayList. Comprender estas estructuras resulta clave para sacar partido a la velocidad y el rendimiento de KDB/Q en

Árboles de búsqueda estáticos: 40 veces más rápidos que la búsqueda binaria

Este artículo técnico presenta la implementación y optimización de un árbol de búsqueda estático (S+ tree) para localizar datos ordenados con un rendimiento muy superior al de la búsqueda binaria clásica. Partiendo de la idea introducida en Algorithmica, el autor parte de un código base y lo somete

Algoritmos prácticos para entornos incrementales de desarrollo de software

Tim A. Wagner presenta en este informe técnico de 1998 una colección integrada de algoritmos y estructuras de datos concebida como base de un entorno práctico de desarrollo incremental de software. El trabajo, realizado en la Universidad de California en Berkeley, introduce una representación con au

Diseñan una cola MPMC rápida con espera acotada para hilos concurrentes

Este artículo describe el diseño y la implementación de una cola de acceso concurrente pensada para comunicar múltiples productores con múltiples consumidores (MPMC, por sus siglas en inglés) en memoria compartida. El autor parte de su interés por las estructuras de datos sin bloqueos y propone una

Diez años de ClickHouse como proyecto de código abierto

ClickHouse cumple una década desde su liberación como software de código abierto el 15 de junio de 2016 y se ha consolidado como la base de datos analítica open source más popular, con más de 2.000 contribuidores. Este artículo repasa la filosofía de desarrollo abierto del proyecto y su evolución té

Array dinámico genérico en C sin struct ni capacidad almacenada

Un desarrollador ha compartido una implementación de array dinámico genérico en C que prescinde de estructuras y del almacenamiento explícito de capacidad. La técnica utiliza un array de dos punteros: el primero guarda la longitud como uintptr_t, y el segundo apunta a los datos. Así, declaraciones c

Optimizar una estructura de ping en C: de 12 KiB a 4 KiB por diversión

Un programador describe cómo, mientras trabajaba con un colega en un sistema de monitorización de conectividad basado en pings ICMP, fue reduciendo progresivamente el tamaño de la estructura de datos que almacena las entradas del anillo (ring buffer) de 512 elementos. Partiendo de un struct inicial

Redis 8.8 introduce la estructura de datos array y mejoras de hasta el 83%

Redis 8.8, la nueva versión de código abierto del almacén de datos en memoria, ya está disponible con una estructura de datos de propósito general llamada array, un limitador de velocidad (rate limiter) de ventana integrada y mejoras de rendimiento de hasta el 83% en operaciones concretas. La nueva

CodeMirror: Diseño simple para edición colaborativa

Este artículo del blog de Marijn Haverbeke explora el diseño de la estructura de datos para cambios de documentos y la función de edición colaborativa en la próxima versión de CodeMirror. El objetivo principal es explicar por qué se optó por una solución aparentemente simple: la transformación opera

Redis: IA impulsa nueva estructura de datos 'Array'

El desarrollador de Redis, Antirez, ha presentado una nueva estructura de datos llamada 'Array' para Redis, resultado de un proceso de desarrollo de cuatro meses que ha incorporado extensivamente la inteligencia artificial. La necesidad de esta nueva estructura surgió de la búsqueda de una forma más

Rust: ¿Propiedad o Conteo de Referencias?

Rust, conocido por su seguridad de memoria sin necesidad de un recolector de basura, logra esto a través de un sistema de propiedad riguroso. Sin embargo, este sistema tiene una 'válvula de escape': el conteo de referencias. Normalmente, cada valor en Rust tiene un único propietario, y cuando ese pr

Rust optimiza memoria al procesar JSON de AWS

Este artículo del blog de dystroy.org describe una optimización significativa de memoria en un programa Rust que deserializa archivos JSON complejos. El problema original era que el programa, al procesar archivos JSON que representan estructuras de datos de AWS (Smithy Shapes), consumía una gran can

Jubbly: Nuevo enfoque para asignar valores en programación

El proyecto 'Jubbly' explora una idea innovadora en diseño de lenguajes de programación, enfocada en simplificar y mejorar la forma en que se realizan las reasignaciones de valores, especialmente en estructuras de datos complejas. Tradicionalmente, en muchos lenguajes, asignar un nuevo valor a una v

Skiplists: la estructura de datos que optimiza análisis

Este artículo de Antithesis.com explora el uso de 'skiplists' y una extensión llamada 'skiptrees' para resolver un problema específico de rendimiento en el análisis de datos. Inicialmente, los skiplists se consideraban una estructura de datos de nicho, pero la empresa descubrió su utilidad para opti

Levenshtein: cálculo rápido con estructura Trie

Este artículo explora una forma eficiente de calcular la distancia de Levenshtein, una métrica que mide la diferencia entre dos cadenas de texto, crucial para funcionalidades como la corrección de errores de escritura en búsquedas web. La distancia de Levenshtein se calcula tradicionalmente con un a

B-trees: la clave para búsquedas rápidas en bases de datos

Este artículo de PlanetScale explica los B-trees y B+trees, estructuras de datos fundamentales en muchos sistemas de gestión de bases de datos (DBMS) como MySQL, PostgreSQL, MongoDB y DynamoDB. Son la base de los índices que permiten búsquedas de datos eficientes. ¿Qué son los B-trees? Un B-tree e

Algoritmos de Red: Más Allá del Transporte

Algoritmos de Flujo de Red: Una Visión General. ¿Qué son y por qué son importantes? Los algoritmos de flujo de red son una herramienta matemática poderosa que permite modelar y resolver problemas que involucran el movimiento de algo a través de una red. Originalmente concebidos para optimizar el tra

Go: Nuevo sistema de logs con buffer circular

El artículo de Alex Rios, "Construyendo slogbox", explora la implementación de un manejador de logs (`slog.Handler`) en Go que utiliza un buffer circular (ring buffer) para almacenar los últimos registros de logs. La motivación surge de la necesidad de tener acceso a logs recientes para fines de mon

K: Eliminan 'raze' para optimizar código

Este artículo explora una optimización interesante en el lenguaje de programación K, específicamente relacionada con la eliminación de una técnica llamada 'raze'. K es un lenguaje de programación de matriz (array language) conocido por su concisión y expresividad. El problema que aborda el autor, Ch

aprende a usar ⍋⍋: la función inesperada de APL

Este artículo explora el significado y la utilidad de la función ⍋⍋ en el lenguaje de programación APL, un tema que inicialmente parecía carecer de sentido según Paul Mansour. Aunque inicialmente se considera inútil (equivalente a una versión más lenta de otra función), el artículo revela una aplica

Recrean Crazy Taxi: Descifran modelos 3D

Este artículo es la segunda parte de una serie que detalla cómo el autor ha recreado los niveles de Crazy Taxi en 3D y los ha puesto a disposición en la web. La primera parte se centró en la decodificación del archivo `.all` del juego, un formato de archivo que contiene miles de recursos del juego.

Pratt Parsing: Analizando código de forma intuitiva

Este artículo explica el 'Pratt Parsing', una técnica ingeniosa para analizar expresiones matemáticas o código, especialmente útil en compiladores. La idea central es que, tradicionalmente, las expresiones (como `a + b * c + d`) se representan en un árbol de sintaxis abstracta (AST) donde los operad

Monuses optimizan búsqueda en montículos

Este artículo explora una estructura algebraica llamada 'monus' y su aplicación en algoritmos de búsqueda y ordenamiento, particularmente en el contexto de montículos (heaps). Un montículo es una estructura de datos en forma de árbol donde el valor de cada nodo es menor o igual que el de sus hijos,

Domina Pandas: 101 ejercicios interactivos

Este recurso, alojado en machinelearningplus.com, ofrece una colección interactiva de 101 ejercicios prácticos para dominar Pandas, una biblioteca fundamental de Python para el análisis y la manipulación de datos. Pandas facilita la carga, limpieza, transformación y análisis de datos tabulares, y es

Rob Pike: 5 Claves para Programar Mejor

Las '5 Reglas de Programación' de Rob Pike, un ingeniero influyente en Google y creador de lenguajes como Go, ofrecen una guía valiosa para el desarrollo de software eficiente y mantenible. Estas reglas, que se basan en principios establecidos por otros grandes de la informática, enfatizan la import

Recursión: A veces, la solución es recursiva

Este artículo explora una idea contraintuitiva en programación: a veces, la mejor solución para un problema recursivo es, precisamente, una solución recursiva. La premisa central es que, aunque teóricamente cualquier función recursiva puede convertirse en una iterativa, esta transformación a menudo

Matemáticas en Python: Descifrando los 'thinnings'

Este artículo explora el concepto de "thinnings", una herramienta matemática que, aunque a menudo vista como compleja en contextos como la teoría de tipos dependientes, puede ser aplicada y comprendida en lenguajes de programación más comunes como Python. En esencia, un thinning es una forma de test

Recursión sin pila: técnica para código más robusto

Este artículo del blog explora una técnica para transformar código recursivo, a menudo elegante y mantenible, en una forma imperativa más robusta, especialmente útil en entornos como Node.js y TypeScript donde los desbordamientos de pila son una preocupación. La idea central es simular explícitament

Emacs: Desentrañando el código Lisp en C

Este artículo de The Cloudlet explora la estructura interna de GNU Emacs, específicamente cómo representa los valores de Lisp (Elisp) en C. El objetivo es comprender el diseño del sistema desde una perspectiva de bajo nivel, desglosando el tipo de dato `Lisp_Object`. La pieza se basa en el conocimie

C: la API de archivos más eficiente, según expertos

El artículo de maurycyz.com argumenta que C posee la mejor API para la manipulación de archivos, destacando una flexibilidad y eficiencia que carecen otros lenguajes de programación. La clave de esta superioridad reside en la capacidad de C para tratar los archivos como si fueran datos en memoria a

Contratación en software: ¿evaluaciones erróneas?

Las prácticas de contratación en la industria del software están siendo cuestionadas debido a lo que se conoce como la “falacia del green lumber” (madera verde), un término acuñado por Nassim Nicholas Taleb para describir la confusión entre conocimiento irrelevante y esencial. El problema radica en

Forth: arrays a la carta, sin estándar fijo

Forth, un lenguaje de programación conocido por su flexibilidad, no tiene una implementación estándar de 'arrays' como otros lenguajes. Esto se debe a que Forth facilita la creación de nuevos tipos de datos, permitiendo a los programadores diseñar estructuras que se adapten perfectamente a sus neces