algorithms · go · leetcode · leetcode-solution · algorithms-data-structures
Array chunking en Go: un enfoque algorítmico completo
A lo largo de mi carrera, me he encontrado con array chunking en todo tipo de contextos, desde sistemas de paginación hasta trabajos de procesamiento por lotes. Lo que a primera vista parece simple esconde edge cases complicados que pueden corromper los datos silenciosamente—como errores fuera de rango o tamaños de chunk inconsistentes.
Hoy voy a mostrar mi algoritmo probado en producción para hacer chunking de arrays en Go—uno que maneja todos esos edge cases de forma limpia.
Planteamiento del problema
Escribir una función que reciba un array y un chunk size como input. La función debe devolver un nuevo array en el que el array original se divide en chunks del tamaño especificado.
Me gusta empezar dividiendo el problema en tres partes: input, proceso y output esperado. De esta forma, puedo identificar los pasos para ir de A (el input) a B (el output).
Input: El array a dividir y un entero que indica el chunk size.
Output: Un array de arrays.
Con esto identificado, puedo empezar con mi solución. El array esperado está formado por arrays más pequeños, donde cada uno es un chunk del array original con el tamaño especificado. Ahora puedo planear un algoritmo para obtener estos chunks.
Algoritmo para resolverlo
El primer paso para dividir el array en chunks es validar el tamaño. Mi primer bloque de código es una sentencia if que revisa si el input es menor o igual a cero. Si lo es, devuelvo nil, ya que el array no se puede dividir en chunks de longitud cero.
if size <= 0 {
return nil
}
Luego, inicializo un nuevo array para almacenar los chunks.
var chunks [][]int
Después, recorro el array original en incrementos del chunk size. Empiezo en el índice cero y, en cada iteración, incremento mi índice por el valor del chunk size. Por ejemplo, si el chunk size es 2, en la primera iteración i = 0, en la segunda i = 2, en la tercera i = 4, y así sucesivamente.
for i := 0; i < len(arr); i += size {}
En cada iteración, necesito determinar la posición final del chunk. Mi variable i marca dónde empieza el chunk, así que uso la función built-in min para encontrar dónde debería terminar.
end := min(i+size, len(arr))
Finalmente, hago append al array chunks con la porción del array original, usando un slice con mis dos variables i y end.
chunks = append(chunks, arr[i:end])
Una vez que recorrí todo el array original, tengo todos los chunks almacenados en el nuevo array. Obtengo mi output esperado—ahora solo necesito devolverlo.
return chunks
Reflexiones finales
Como se puede ver, mi enfoque es simple pero efectivo. Me gusta mantener las cosas simples—prefiero entender el problema antes que perseguir soluciones rebuscadas.
Para ver el código de este y otros algoritmos, este es mi repositorio de GitHub: https://github.com/RubenOAlvarado/algorithms
Hay que recordar que este es mi algoritmo—se puede definir uno propio. Esto puede servir de guía en caso de quedarse atascado o tener dudas sobre el tema. Después de todo, los mejores artistas roban, y programar es un arte.
¿Qué otras estrategias de chunking se han usado en producción? O mejor aún—se puede extender esto para manejar arrays 2D y compartir la solución en GitHub. A seguir programando, nos vemos en el próximo artículo.