Skip to content

Commit c064dc6

Browse files
authored
Merge pull request #22 from midudev/midudev-adaptar-pr-algoritmos
feat(compression): adapt Huffman coding to current architecture
2 parents 89516eb + 45f87af commit c064dc6

18 files changed

Lines changed: 1204 additions & 0 deletions

File tree

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import type { Locale } from '@i18n/translations'
2+
3+
const descriptions: Record<Locale, string> = {
4+
en: `Huffman Coding
5+
6+
Huffman Coding is a greedy algorithm for lossless data compression. It assigns shorter binary codes to frequent characters and longer codes to rare ones, reducing the total number of bits needed to represent the data.
7+
8+
How it works:
9+
1. Count how often each character appears
10+
2. Create a leaf node per character and put them in a min-priority queue
11+
3. Repeatedly remove the two lowest-frequency nodes and merge them under a new parent whose frequency is their sum
12+
4. When one node remains, use it as the tree root
13+
5. Assign codes by walking the tree: left = 0, right = 1
14+
15+
Why it works:
16+
No code is a prefix of another, so the encoded bitstream decodes unambiguously. The greedy merge guarantees an optimal prefix code for the given frequencies.
17+
18+
Time Complexity:
19+
Best: O(n log n)
20+
Average: O(n log n)
21+
Worst: O(n log n)
22+
23+
Space Complexity: O(n)
24+
25+
Properties:
26+
- Lossless: the original data is recovered exactly
27+
- Optimal among prefix codes for a known frequency distribution
28+
- Used in DEFLATE (ZIP, gzip, PNG), JPEG, and MP3
29+
30+
Invented by David A. Huffman in 1952 while he was a student at MIT, it remains a cornerstone of modern compression.`,
31+
es: `Codificación de Huffman
32+
33+
La Codificación de Huffman es un algoritmo voraz para compresión de datos sin pérdida. Asigna códigos binarios más cortos a los caracteres frecuentes y más largos a los raros, reduciendo la cantidad total de bits necesarios para representar los datos.
34+
35+
Cómo funciona:
36+
1. Contar cuántas veces aparece cada carácter
37+
2. Crear un nodo hoja por carácter y ponerlos en una cola de prioridad mínima
38+
3. Quitar repetidamente los dos nodos de menor frecuencia y fusionarlos bajo un nuevo padre cuya frecuencia sea la suma
39+
4. Cuando quede un solo nodo, usarlo como raíz del árbol
40+
5. Asignar códigos recorriendo el árbol: izquierda = 0, derecha = 1
41+
42+
Por qué funciona:
43+
Ningún código es prefijo de otro, así que el flujo de bits codificado se decodifica sin ambigüedad. La fusión voraz garantiza un código de prefijo óptimo para las frecuencias dadas.
44+
45+
Complejidad Temporal:
46+
Mejor: O(n log n)
47+
Promedio: O(n log n)
48+
Peor: O(n log n)
49+
50+
Complejidad Espacial: O(n)
51+
52+
Propiedades:
53+
- Sin pérdida: los datos originales se recuperan exactamente
54+
- Óptimo entre los códigos de prefijo para una distribución de frecuencias conocida
55+
- Usado en DEFLATE (ZIP, gzip, PNG), JPEG y MP3
56+
57+
Inventado por David A. Huffman en 1952 cuando era estudiante en el MIT, sigue siendo un pilar de la compresión moderna.`,
58+
}
59+
60+
export default descriptions

src/i18n/translations.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ export const translations: Record<Locale, Translations> = {
163163
Backtracking: 'Backtracking',
164164
'Divide and Conquer': 'Divide and Conquer',
165165
Math: 'Math',
166+
Compression: 'Compression',
166167
},
167168
},
168169

@@ -243,6 +244,7 @@ export const translations: Record<Locale, Translations> = {
243244
Backtracking: 'Backtracking',
244245
'Divide and Conquer': 'Divide y Vencerás',
245246
Math: 'Matemáticas',
247+
Compression: 'Compresión',
246248
},
247249
},
248250
}

src/lib/algorithms/catalog.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,14 @@ export const algorithmCatalog: AlgorithmSummary[] = [
295295
difficulty: 'intermediate',
296296
visualization: 'matrix',
297297
},
298+
// Compression
299+
{
300+
id: 'huffman-coding',
301+
name: 'Huffman Coding',
302+
category: 'Compression',
303+
difficulty: 'advanced',
304+
visualization: 'concept',
305+
},
298306
]
299307

300308
const CATEGORY_ORDER = [
@@ -307,6 +315,7 @@ const CATEGORY_ORDER = [
307315
'Backtracking',
308316
'Divide and Conquer',
309317
'Math',
318+
'Compression',
310319
] as const
311320

312321
export const catalogCategories: CategorySummary[] = CATEGORY_ORDER.map((name) => ({

0 commit comments

Comments
 (0)