Motor de gestión de datos de alto rendimiento desarrollado en C++. El proyecto simula una plataforma de microblogging (como Twitter/X) centrada en la eficiencia algorítmica, utilizando estructuras de datos avanzadas para el almacenamiento, búsqueda y recuperación de "Cuacs" (equivalente a los "tweets").
Estructuras Híbridas y Escalado Dinámico:
- Tabla Hash con Rehash: Acceso indexado
$O(1)$ . Implementa redimensionamiento dinámico automático (factor de carga >0.75) para garantizar que el rendimiento no degrade con millones de usuarios. - Árboles AVL: Búsquedas temporales y por ID garantizadas en
$O(log n)$ mediante balanceo automático de ramas (rotaciones).
- Tabla Hash con Rehash: Acceso indexado
Persistencia Profesional (SQLite Engine):
- Motor de persistencia incremental basado en SQLite 3.
- Uso de Prepared Statements para garantizar máximo rendimiento y seguridad (evitando ataques de inyección SQL).
- Sincronización automática del contador de IDs de los cuacs entre sesiones.
Arquitectura Limpia:
- Separación estricta de responsabilidades:
src/model: Entidades de datos puros.src/storage: Motores de datos e índices (Estructuras de datos).src/cli: Capa de interacción con el usuario (Interfaz).
- Migración completa a un sistema de construcción profesional con CMake.
- Separación estricta de responsabilidades:
Gestión de Ciclo de Vida (CRUD):
- Implementado el comando
deletecon rebalanceo real de árboles AVL y purga sincronizada en la Tabla Hash.
- Implementado el comando
Grafo Social (Seguidores):
- Tabla
seguidoresen SQLite con clave primaria compuesta(seguidor, seguido)que elimina duplicados de forma nativa. - Caché en RAM del grafo usando
unordered_map<string, unordered_set<string>>para lookups$O(1)$ . - Timeline personalizado: el comando
lastmuestra solo los cuacs de los usuarios seguidos + los propios cuando hay sesión activa. - Sistema de sesión ligero con
login/logout— sin login, el sistema funciona en modo global (retrocompatible).
- Tabla
Arquitectura Zero-Padding: Estructura de memoria de 128 bytes optimizada para eliminar el padding y maximizar la caché L1/L2.
Semántica de Movimiento: Uso de
std::moveyemplace_backen todo el motor para evitar copias de memoria innecesarias.Tuning de SQLite: Modo Write-Ahead Logging (WAL) y sincronía NORMAL para persistencia masiva de alta velocidad.
| Comando | Operación | Complejidad | Nota |
|---|---|---|---|
mcuac <usr> <fecha> <msg> | Publicar mensaje manual | RAM + SQLite | |
pcuac <usr> <fecha> <num> | Publicar mensaje predefinido | RAM + SQLite | |
follow <usuario> | Seguir a un usuario y ver sus cuacs | Hash + SQLite (grafo) | |
last <N> | Últimos N cuacs (global o timeline personal) | AVL filtrado o global | |
date <f1> <f2> | Cuacs en rango de fechas | AVL (RAM) | |
tag <#hashtag> | Búsqueda por hashtag | Índice hashtags | |
search <texto> | Búsqueda de texto libre | AVL inorden | |
delete <id> | Borrar cuac por ID | RAM + SQL DELETE | |
check | Verificar integridad de la BBDD | PRAGMA integrity |
| Comando | Operación |
|---|---|
login <usuario> | Iniciar sesión (carga grafo en RAM desde SQLite) |
logout | Cerrar sesión (vuelve al modo global) |
whoami | Mostrar el usuario con sesión activa |
unfollow <usuario> | Dejar de seguir a un usuario |
following | Ver la lista de usuarios que sigues |
followers | Ver la lista de usuarios que te siguen |
Note
last con login activo tiene complejidad unordered_set es
Siendo:
$n$ : Número total de Cuacs almacenados en el sistema.$k$ : Número de elementos recuperados y mostrados.$m$ : Longitud de la cadena buscada (comandosearch).
Se ha verificado la robustez del sistema con un Stress Test masivo:
- Inserción: Sostenida gracias al Rehash dinámico (la tabla crece automáticamente hasta +400.000 buckets).
- Recuperación AVL (
last): 4.18 ms para 100 consultas sobre 300.000 elementos. - Proyección 1M Cuacs: ~4.6 ms (el crecimiento es logarítmico, solo un 10% más lento con el triple de datos).
- Búsqueda Hash: Acceso instantáneo a cualquier usuario entre millones.
- Compilador C++11 o superior (GCC/MinGW, Clang).
- CMake (v3.10+).
mkdir build &&cd build
cmake ..
cmake --build .- Al primer arranque, el sistema crea automáticamente el archivo
cuacs.db. - Los datos se guardan en tiempo real sin necesidad de comandos manuales.
- Puedes usar el comando
checkpara ejecutar unPRAGMA integrity_checksobre la base de datos almacenada.
Desarrollado para la asignatura de Algoritmos y Estructuras de Datos.