Semana2 - davidethc/AlgoritmosJava GitHub Wiki
📘 Capítulo 2: Algoritmia Elemental
Basado en: Fundamentos de Algoritmia — Brassard & Bratley
🔍 Introducción
Este capítulo se centra en los conceptos básicos de la algoritmia, esenciales para resolver problemas computacionales. La comprensión de algoritmos elementales es la base sobre la cual se construyen soluciones más complejas y eficientes.
🧾 ¿Qué es un Algoritmo Elemental?
Un algoritmo elemental es una secuencia finita de pasos simples y precisos que permiten resolver un problema específico. Aunque su estructura es sencilla, estos algoritmos son fundamentales en la programación.
🧩 Estructuras de Control
Son los pilares de todo algoritmo y determinan cómo se ejecutan las instrucciones:
- 🔹 Secuencia: Las instrucciones se ejecutan una tras otra en orden.
- 🔸 Selección: Se toman decisiones usando estructuras como
if,else,switch. - 🔁 Repetición: Se repiten bloques de código usando
for,while,do-while.
✅ Ejemplo en Java: Estructuras de control básicas
public class EstructurasControl {
public static void main(String[] args) {
int numero = 5;
// Secuencia
System.out.println("Inicio");
System.out.println("Número: " + numero);
// Selección
if (numero % 2 == 0) {
System.out.println("Es par");
} else {
System.out.println("Es impar");
}
// Repetición
for (int i = 1; i <= numero; i++) {
System.out.println("Iteración " + i);
}
}
}
🧠 Técnicas de Diseño
Diversas estrategias pueden utilizarse para resolver problemas computacionales:
- 🛠 Fuerza Bruta: Probar todas las posibilidades hasta hallar la solución correcta.
- 🔙 Backtracking: Explorar soluciones y retroceder cuando no se cumple una condición.
- ✂️ División y conquista: Dividir el problema en subproblemas más simples, resolverlos y combinarlos.
🔎 Ejemplos de Algoritmos Elementales
1. 📦 Búsqueda Lineal
public class BusquedaLineal {
public static int buscar(int[] arr, int valor) {
for (int i = 0; i < arr.length; i++) {
if (arr[i] == valor) return i;
}
return -1;
}
public static void main(String[] args) {
int[] datos = {4, 7, 1, 9, 3};
int resultado = buscar(datos, 9);
System.out.println("Índice encontrado: " + resultado);
}
}
- Complejidad: O(n)
- Uso: Arreglos pequeños o sin orden específico.
2. 🧮 Búsqueda Binaria
public class BusquedaBinaria {
public static int buscar(int[] arr, int clave) {
int inicio = 0, fin = arr.length - 1;
while (inicio <= fin) {
int medio = (inicio + fin) / 2;
if (arr[medio] == clave) return medio;
if (arr[medio] < clave) inicio = medio + 1;
else fin = medio - 1;
}
return -1;
}
public static void main(String[] args) {
int[] datos = {1, 3, 5, 7, 9};
int resultado = buscar(datos, 7);
System.out.println("Índice encontrado: " + resultado);
}
}
- Complejidad: O(log n)
- Requiere: Arreglos ordenados.
⚙️ Complejidad Computacional
La complejidad mide los recursos que un algoritmo necesita:
- ⌛ Tiempo: ¿Cuánto tarda?
- 💾 Espacio: ¿Cuánta memoria usa?
📐 Notación Big O
| Notación | Descripción | Ejemplo común |
|---|---|---|
| O(1) | Tiempo constante | Acceso directo a un arreglo |
| O(n) | Tiempo lineal | Búsqueda lineal |
| O(log n) | Tiempo logarítmico | Búsqueda binaria |
| O(n²) | Tiempo cuadrático | Doble bucle anidado |
📌 Conclusión
Este capítulo establece la base esencial de la algoritmia elemental. Comprender estas técnicas y estructuras permite:
- 🧠 Pensar algorítmicamente.
- 🛠 Resolver problemas simples de forma eficiente.
- 🔄 Escalar soluciones hacia algoritmos más avanzados.
Antes de diseñar soluciones complejas, es vital dominar los conceptos fundamentales tratados aquí.