Introducción a los algoritmos y estructuras de datos en Java
El estudio de algoritmos y estructuras de datos es la base sobre la que se construye la carrera de cualquier programador. Para los desarrolladores de Java, comprender cómo funcionan las estructuras de datos y los algoritmos básicos es crítico: esto afecta directamente el rendimiento, la legibilidad del código y la capacidad de resolver problemas complejos. En este artículo, desglosaremos los conceptos clave en un lenguaje sencillo, con ejemplos de código claros en Java.
Ya sea que te estés preparando para una entrevista o simplemente quieras escribir código más eficiente, este artículo será tu punto de partida.
¿Qué son las estructuras de datos?
Una estructura de datos es una forma de organizar y almacenar datos en la memoria de la computadora. La elección correcta de una estructura de datos puede acelerar un programa decenas de veces. En Java, existen dos tipos de estructuras de datos: integradas (arrays) y colecciones (clases del Java Collections Framework).
Arrays (Array)
El array es la estructura de datos más simple y rápida. Almacena elementos del mismo tipo en un área de memoria contigua. El acceso a un elemento por índice es instantáneo (O(1)), pero agregar o eliminar elementos requiere recrear el array.
public class ArrayExample { public static void main(String[] args) { // Declaración e inicialización de un array int[] numbers = new int[5]; numbers[0] = 10; numbers[1] = 20; numbers[2] = 30; // Forma alternativa String[] fruits = {"Manzana", "Banana", "Naranja"}; // Recorrer el array for (int i = 0; i < fruits.length; i++) { System.out.println(fruits[i]); } }}ArrayList — array dinámico
ArrayList resuelve el principal problema del array normal: el tamaño fijo. Se expande automáticamente al agregar nuevos elementos. Es una de las estructuras de datos más populares en Java.
import java.util.ArrayList;
public class ArrayListExample { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); // Agregar elementos list.add("Java"); list.add("Python"); list.add("JavaScript"); // Obtener elemento por índice System.out.println("Primer elemento: " + list.get(0)); // Eliminar elemento list.remove("Python"); // Tamaño de la lista System.out.println("Tamaño de la lista: " + list.size()); }}Algoritmos básicos para principiantes
Un algoritmo es una secuencia de pasos para resolver un problema. Veremos tres algoritmos básicos que todo desarrollador Java debería conocer.
Búsqueda lineal
El algoritmo de búsqueda más simple: verificamos secuencialmente cada elemento del array hasta encontrar el deseado.
public class LinearSearch { public static int findElement(int[] arr, int target) { for (int i = 0; i < arr.length; i++) { if (arr[i] == target) { return i; // Devuelve el índice del elemento encontrado } } return -1; // Elemento no encontrado } public static void main(String[] args) { int[] data = {5, 3, 8, 1, 9, 2}; int index = findElement(data, 8); System.out.println("Índice del elemento 8: " + index); // Imprime: 2 }}Búsqueda binaria
La búsqueda binaria es significativamente más rápida que la lineal, pero requiere que el array esté ordenado. El algoritmo divide el array por la mitad en cada paso, descartando la mitad de los elementos.
import java.util.Arrays;
public class BinarySearch { public static int binarySearch(int[] arr, int target) { int left = 0; int right = arr.length - 1; while (left <= right) { int mid = l