Un algoritmo optimizado con HashMap para navegación eficiente en flujos de chatbot, implementado tanto en Python como en TypeScript/JavaScript con benchmarks completos de rendimiento y memoria.
- 🎯 Características
- ⚡ Quick Start
- 🏗️ Instalación
- 📊 Benchmarks
- 🧪 Scripts Disponibles
- 📁 Estructura del Proyecto
- 💻 Uso del API
- 🔧 Configuración
- 📈 Resultados de Performance
- 🔒 Seguridad y Privacidad
- 🤝 Contribuir
- ✅ Algoritmo O(1) para acceso a nodos por ID
- ✅ Búsqueda O(k) donde k = edges del nodo actual
- ✅ Implementación dual: Python y TypeScript/JavaScript
- ✅ Benchmarks exhaustivos de rendimiento y memoria
- ✅ Generación automática de datasets grandes para testing
- ✅ Medición precisa de microsegundos y uso de memoria
- ✅ Comparación directa entre lenguajes
- ✅ Datos anonimizados seguros para repositorios públicos
# Clonar el repositorio
git clone https://github.com/The-Spik3r/algorithm-HashMap-Map.git
cd algorithm-HashMap-Map
# Configuración inicial
npm run setup
# Demo rápido
npm run demo
# Benchmark completo
npm run benchmark:comparison- Python 3.8+ con psutil
- Node.js 18+ con npm
- Sistema Linux/Ubuntu (para scripts de shell)
# 1. Instalar dependencias de Node.js
npm install
# 2. Instalar dependencias de Python
sudo apt install python3-psutil -y
# 3. Verificar instalación
python3 --version
node --version
npm --version# Benchmark básico (datasets pequeños)
npm run benchmark:simple
# Benchmark avanzado con medición de memoria
npm run benchmark:python-advanced
npm run benchmark:js
# Comparación completa Python vs JavaScript
npm run benchmark:comparison
# Generar datasets grandes y benchmarking completo
npm run test:large| Dataset | Nodos | Python (Memoria) | JavaScript (Memoria) | Python (Velocidad) | JavaScript (Velocidad) |
|---|---|---|---|---|---|
| Pequeño | 11 | 0.00 MB | 7.18 MB | 0.6 μs | 0.2 μs |
| Mediano | 1K | 3.06 MB | 2.53 MB | 0.6 μs | 0.2 μs |
| Grande | 5K | 11.98 MB | 20.67 MB | 0.5 μs | 0.4 μs |
| Muy Grande | 10K | 24.99 MB | 31.02 MB | 0.5 μs | 0.1 μs |
| Script | Descripción |
|---|---|
npm run demo |
Demo rápido con dataset original |
npm run generate-data |
Genera datasets grandes (1K, 5K, 10K nodos) |
npm run clean-sensitive |
Limpia datos sensibles para GitHub |
npm run benchmark:python |
Benchmark básico de Python |
npm run benchmark:js |
Benchmark básico de JavaScript |
npm run benchmark:comparison |
Comparación completa con análisis |
| Script | Descripción |
|---|---|
npm run build |
Compilar TypeScript |
npm run clean |
Limpiar archivos temporales |
npm run setup |
Configuración inicial completa |
npm run help |
Mostrar ayuda de comandos |
| Script | Descripción |
|---|---|
npm run test:small |
Test con datasets pequeños |
npm run test:large |
Test con datasets grandes |
npm run benchmark:all |
Todos los benchmarks básicos |
algorithm-HashMap-Map/
├── 📄 README.md # Esta documentación
├── 📦 package.json # Configuración de Node.js
├── ⚙️ tsconfig.json # Configuración de TypeScript
├──
├── 🐍 **Implementación Python**
│ ├── algorith.py # Clase ChatbotFlowNavigator (Python)
│ ├── index.py # Benchmark básico Python
│ └── benchmark_advanced.py # Benchmark avanzado Python
├──
├── 🚀 **Implementación TypeScript/JS**
│ ├── algorithm.ts # Clase ChatbotFlowNavigator (TypeScript)
│ ├── index.ts # Benchmark básico TypeScript
│ └── benchmark_js.cjs # Benchmark JavaScript
├──
├── 📊 **Datos y Generación**
│ ├── data/
│ │ ├── nodes.json # Dataset original (11 nodos)
│ │ ├── edges.json # Dataset original (14 edges)
│ │ ├── nodes_1000.json # Dataset generado (1K nodos)
│ │ ├── edges_1000.json # Dataset generado
│ │ ├── nodes_5000.json # Dataset generado (5K nodos)
│ │ ├── edges_5000.json # Dataset generado
│ │ ├── nodes_10000.json # Dataset generado (10K nodos)
│ │ └── edges_10000.json # Dataset generado
│ └── generate_data.py # Generador de datasets
├──
├── 🔨 **Scripts de Benchmark**
│ ├── benchmark.sh # Benchmark básico
│ ├── final_comparison.sh # Comparación completa
│ └── results_*.txt # Archivos de resultados
└──
└── 📁 **Compilados**
└── dist/ # Archivos TypeScript compilados
from algorith import ChatbotFlowNavigator
import json
# Cargar datos
with open("data/nodes.json", "r") as f:
nodes = json.load(f)
with open("data/edges.json", "r") as f:
edges = json.load(f)
# Inicializar navegador
navigator = ChatbotFlowNavigator(nodes, edges)
# Buscar siguiente nodo
criteria = {
"button_type": "QUICK_REPLY",
"target_contains": "node-GE2H6"
}
next_node = navigator.find_next_node("node-8E70X", criteria)
if next_node:
print(f"Encontrado: {next_node['id']}")import { ChatbotFlowNavigator } from "./algorithm.js";
import * as fs from "fs";
// Cargar datos
const nodes = JSON.parse(fs.readFileSync("data/nodes.json", "utf-8"));
const edges = JSON.parse(fs.readFileSync("data/edges.json", "utf-8"));
// Inicializar navegador
const navigator = new ChatbotFlowNavigator(nodes, edges);
// Buscar siguiente nodo
const criteria = {
button_type: "QUICK_REPLY",
target_contains: "node-GE2H6",
};
const nextNode = navigator.findNextNode("node-8E70X", criteria);
if (nextNode) {
console.log(`Encontrado: ${nextNode.id}`);
}const criteria = {
button_type: "QUICK_REPLY", // Tipo de botón
edge_type: "custom-edge", // Tipo de edge
target_contains: "node-123", // Contenido en target
};{
"id": "node-123",
"data": {
"type": "text_message",
"label": "Mensaje de prueba",
"message": "Hola, ¿cómo estás?",
"buttons": [
{
"id": "btn-1",
"text": "Bien",
"type": "QUICK_REPLY"
}
]
}
}{
"id": "edge-123",
"source": "node-123",
"target": "node-456",
"sourceHandle": "source-node-123-QUICK_REPLY-0",
"type": "custom-edge"
}- JavaScript: ~0.1-0.4 μs por búsqueda
- Python: ~0.3-0.7 μs por búsqueda
- Ganador: JavaScript (2-3x más rápido)
- Python: ~2.3-2.4 KB por nodo
- JavaScript: ~2.9-4.0 KB por nodo
- Ganador: Python (20% más eficiente)
- Ambos lenguajes: ~10-12ms para 10,000 nodos
- Complejidad: O(n) para inicialización
- Resultado: Empate técnico
- Usa Python si: Priorizas eficiencia de memoria y legibilidad
- Usa JavaScript si: Necesitas máxima velocidad y integración web
- Para aplicaciones reales: Ambos son prácticamente idénticos
Este proyecto incluye datasets completamente anonimizados seguros para repositorios públicos:
- ✅ Mensajes genéricos sin información empresarial específica
- ✅ IDs aleatorios sin patrones identificables
- ✅ Textos de ejemplo sin contenido sensible
- ✅ Backup automático de datos originales
# Limpiar datos sensibles antes de subir a GitHub
npm run clean-sensitive
# Esto genera:
# ├── data/nodes.json # ✅ Versión limpia para GitHub
# ├── data/edges.json # ✅ Versión limpia para GitHub
# └── data/backup/ # 🔒 Respaldo de datos originales
# ├── nodes_original.json # 🔒 Solo local, no en Git
# └── edges_original.json # 🔒 Solo local, no en Git- Siempre ejecuta
npm run clean-sensitiveantes de hacer commit - Revisa los archivos en
data/antes de subirlos - Mantén los backups solo localmente
- No incluyas datos de producción en repositorios públicos
- Fork el proyecto
- Crea una rama para tu feature (
git checkout -b feature/AmazingFeature) - Commit tus cambios (
git commit -m 'Add some AmazingFeature') - Push a la rama (
git push origin feature/AmazingFeature) - Abre un Pull Request
Este proyecto está bajo la Licencia MIT. Ver el archivo LICENSE para más detalles.
The-Spik3r
- GitHub: @The-Spik3r
- Algoritmo HashMap optimizado para navegación de grafos
- Benchmarking exhaustivo Python vs JavaScript
- Comunidad open source por las herramientas utilizadas
⭐ ¡Si este proyecto te ayudó, dale una estrella! ⭐