📊
Avanzado
13 min lecturaOptimización de algoritmos
Elige estructuras de datos y algoritmos eficientes
Optimización de algoritmos y complejidad
Mejorar el algoritmo suele aportar más rendimiento que micro‑optimizaciones. Conoce Big‑O y elige estructuras adecuadas.
Complejidad temporal
- O(1): Constante
- O(log n): Logarítmica
- O(n): Lineal
- O(n log n): Quicksort / mergesort
- O(n²): Bucles anidados
Ejemplos
// ❌ O(n²) - nested loop
function findDuplicates(arr) {
const duplicates = [];
for (let i = 0; i < arr.length; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (arr[i] === arr[j]) duplicates.push(arr[i]);
}
}
return duplicates;
}
// ✅ O(n) using Set
function findDuplicatesOptimized(arr) {
const seen = new Set();
const duplicates = new Set();
for (const item of arr) {
if (seen.has(item)) duplicates.add(item);
else seen.add(item);
}
return [...duplicates];
}
Estructuras de datos
// Use Map for O(1) lookups
const map = new Map();
map.set('key', 'value');
map.get('key'); // O(1)
// Use Set for unique values
const unique = new Set([1, 2, 2, 3]);
// Use Object for simple hash
const cache = Object.create(null);
cache['key'] = 'value';
Optimizar búsquedas
// ❌ Linear search in array
const users = [{ id: 1 }, { id: 2 }];
const user = users.find(u => u.id === 2);
// ✅ Index by id
const userMap = new Map(users.map(u => [u.id, u]));
const userFast = userMap.get(2);
Buenas prácticas
- Optimiza el algoritmo antes que micro‑optimizaciones
- Evita bucles anidados innecesarios
- Usa Set/Map para búsquedas rápidas
- Mide el rendimiento con datos reales