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.