Algoritmos Flashcards

(34 cards)

1
Q

ALGORITMOS: ¿Qué es un algoritmo?

A

Un conjunto de instrucciones claras y ordenadas
que se siguen paso a paso
para resolver un problema o hacer una tarea
en un tiempo finito ‼️‼️‼️‼️
a partir de unos datos de entrada

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

ALGORITMOS: ¿Cuáles son los métodos para representar o resolver algoritmos?
Dos Formales Pandillas Sureñas Fenomenales

A
  • Diagrama de flujo: Representación gráfica con símbolos y flechas
  • Pseudocódigo: Descripción en lenguaje informal estructurado
  • Sistemas formales: Uso de expresiones matemáticas lógicas
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

ANÁLISIS Y DISEÑO: ¿Qué es el análisis y diseño para la resolución de algoritmos ?

A
  • Análisis: Estudiar la eficiencia del algoritmo
    (cuánto tiempo tarda y cuánta memoria usa)
  • Diseño: Crear una solución paso a paso que sea clara, eficiente y correcta
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

ANÁLISIS Y DISEÑO: ¿Cuáles son las principales TÉCNICAS DE DISEÑO de algoritmos?
Don Víctor Planta Bambú Rojo Pronto

A
  • Divide y vencerás: Divide el problema en subproblemas más pequeños (merge sort)
  • Voraces: Elige la mejor opción en cada paso
  • Probabilísticas: Usan azar (ej. Montecarlo, Las Vegas)
  • Backtracking: Explora todas las opciones posibles como un árbol pudiendo retroceder para elegir de nuevo
  • Ramificación y poda: Como backtracking, pero eliminando ramas inútiles
  • Programación dinámica: Resuelve subproblemas y combina soluciones
    (bottom-up o top-down con memorización)
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

ANÁLISIS Y DISEÑO: ¿Ejemplo de la técnica divide y vencerás?

A

Problema: Ordenar una lista de números
Algoritmo: Merge Sort

Pasos:
- Dividir la lista en mitades hasta que quede una sola posición
- Ordenar cada mitad por separado
- Combinar (merge) las mitades ordenadas

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

ANÁLISIS Y DISEÑO: ¿Ejemplo de la técnica voraz? Tipo de algoritmo.

A

Problema: Encontrar el camino más corto entre dos nodos
Algoritmo: Dijkstra
Requiere: Un grafo con pesos NO negativos

Pasos:
- Empieza desde el nodo inicial
- En cada paso, elige el nodo más cercano no visitado
- Actualiza las distancias más cortas conocidas
- Repite hasta llegar al destino

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

ANÁLISIS Y DISEÑO: ¿Ejemplo de la técnica probabilística? Números primos. Tipo de algoritmo.

A

Problema: Verificar si un número es primo
Algoritmo: Miller-Rabin (tipo Monte Carlo)

Características:
- Usa números aleatorios para hacer pruebas
- Puede dar una respuesta incorrecta con muy baja probabilidad
- Es rápido y útil para números muy grandes

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

ANÁLISIS Y DISEÑO: ¿Ejemplo de la técnica backtracking?

A

Problema: Resolver un Sudoku
Algoritmo: Búsqueda con retroceso (backtracking)
Método: Tipo prueba y error

Otros ejemplos clásicos:
- El problema del caballo
- Las ocho reinas (extensible a n²)

Pasos:
- Rellenar una celda vacía con un número posible
- Avanzar a la siguiente celda
- Si no hay opción válida, retroceder (backtrack) y probar otra
- Repetir hasta completar la solución válida

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

ANÁLISIS Y DISEÑO: ¿Qué es la técnica ramificación y poda? ¿En que técnica se basa?

A
  • Técnica basada en backtracking (si no funciona, regresamos)
  • Explora un árbol de soluciones
  • Ramificación: generar todas las posibles opciones desde un nodo
  • Poda: eliminar ramas que no pueden mejorar la solución actual
  • Reduce el número de caminos explorados
  • Muy útil en problemas de optimización (como el del viajante)
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

ANÁLISIS Y DISEÑO: ¿Qué es la técnica programación dinámica?

A
  • Resuelve problemas dividiéndolos en subproblemas más pequeños
  • Guarda las soluciones de los subproblemas para no repetir cálculos (MEMOIZACION)
  • Usa enfoques bottom-up o top-down con memorización
  • Ideal cuando el problema tiene subproblemas solapados y estructura óptima

Ejemplo clásico:
- Problema de la mochila
- Fibonacci (más eficiente que con recursión simple)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

ANÁLISIS Y DISEÑO: ¿Qué es la notación Big O? ¿De fine el mejor 💚 o el peor 🔴 de los casos?

A
  • Es una forma de expresar la ✨`eficiencia‘✨ de un algoritmo
  • Mide cuanto crece el tiempo o memoria según el tamaño de los datos
  • Describe el peor 🔴 caso en la mayoría de los casos
  • Permite comparar algoritmos de forma abstracta

Ejemplos:
- O(1) → constante
- O(log n) → logarítmico (búsqueda binaria)
- O(n) → lineal
- O(n²) → cuadrático
- O(cⁿ) → exponencial (ej. backtracking en problemas complejos)
- O(n^f(n)) → subexponencial (f(n) < n, más lento que polinómico)
- O(nⁿ) → superexponencial (crece muchísimo más rápido que exponencial)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

ANÁLISIS Y DISEÑO: ¿Qué es la complejidad logarítmica?

A
  • Es una complejidad donde el problema se reduce a la mitad en cada paso
  • Se representa como O(log n)
  • Es muy eficiente con grandes cantidades de datos
  • Ejemplo: búsqueda binaria en listas ordenadas
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

ALGORTIMOS DE ORDENACIÓN: ¿Clasificación general de los algoritmos de ordenación?
Isabel Escribe Notas Elegantes Diarias

A

Interno (memoria)
- Ordena cuando todos los datos caben en RAM.
🧠 Ej: ordenar 100 números en una lista en Python en memoria.

Externo (fichero)
- Ordena cuando los datos no caben en RAM y se trabaja con disco.
🧠 Ej: ordenar un archivo enorme de 10 GB en un servidor.

Natural
- Se aprovecha si la ENTRADA ya está ordenada (parcial o totalmente).
🧠 Ej: lista [1,2,3,7,8] se ordena muy rápido porque ya casi está en orden.

Estable
- Mantiene el orden original entre elementos con valores iguales.
🧠 Ej: [A1, A2, B] → tras ordenar por letra sigue [A1, A2, B].

Directa
- Ordena comparando los elementos uno a uno desde el principio hasta el final (método básico y lento).
🧠 Ej: el burbujeo: [3,2,1] → compara 3 y 2 → [2,3,1] → compara 3 y 1 → [2,1,3]…

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

ALGORTIMOS DE ORDENACIÓN: ¿Métodos de ordenación más comunes?
El señor inspector me decepciona

A

🔄 Exchange sort: comparan elementos y los intercambian si están fuera de orden.
🎯 Selection sort: buscan el elemento correcto (mínimo/máximo) y lo colocan en su posición final.
📝 Insertion sort: insertan cada nuevo elemento en su lugar dentro de la parte ya ordenada.
🪢 Merge sort: dividen la lista en partes pequeñas, las ordenan y luego las juntan en orden.
📦 Distribution sort: agrupan los elementos en contenedores/cubetas según reglas y luego los reordenan.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

ALGORTIMOS DE ORDENACIÓN: ¿Cómo funciona el algoritmo Burbuja sort?

A
  • Pertenece a la categoría exchange sort
    El algoritmo Bubble Sort ordena una lista comparando e intercambiando pares de elementos adyacentes desde la izquierda, en múltiples pasadas. En cada pasada, el mayor valor se mueve (como una burbuja) hacia el final de la lista.

🔹 Siempre empieza desde el principio en cada pasada
🔹 Continúa hasta que ya no se hagan intercambios

🧠 Ejemplo con [5, 1, 4]:
1ª pasada → [1, 5, 4][1, 4, 5]
2ª pasada → compara desde el principio, ya está ordenado

📈 Eficiencia:
- Mejor caso (lista ya ordenada): O(n)
- Peor caso (lista invertida): O(n²)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

ALGORTIMOS DE ORDENACIÓN: ¿Cómo funciona el algoritmo Quicksort? ¿A que categoría pertenece?

A
  • Pertenece a la categoría exchange sort
  • Elige un elemento como pivote
  • Divide la lista en dos: menores y mayores que el pivote
  • Ordena recursivamente cada sublista
  • Muy eficiente en promedio: O(n log n)
  • Peor caso: O(n²) (si el pivote es muy mal elegido)
17
Q

ALGORTIMOS DE ORDENACIÓN: ¿Cómo funcionan los algoritmos inserción e inserción binaria?

A
  • Ambos pertenecen a la categoría insertion sort
  • Recorren la lista de izquierda a derecha
  • Cada nuevo elemento se inserta en su posición correcta respecto a los anteriores

Inserción directa:
- Compara hacia atrás uno a uno hasta encontrar su lugar
- Ejemplo: en [2, 4, 7], insertamos 3
- Compara con 7 → luego con 4 → ve que 3 < 4 y 3 > 2
- Inserta antes de 2
- Se empieza a comparar desde el último dato porque la lista ya está ordenada

Inserción binaria: 🧠🧠 La búsqueda binaria consiste en encontrar un valor en una lista ordenada dividiéndola repetidamente por la mitad hasta localizarlo o descartarlo
- Usa búsqueda binaria para encontrar la posición correcta
- En cada paso compara con el pivote (el elemento central del rango)
- Luego desplaza los elementos para insertar
- Ejemplo: en [2, 4, 7], insertamos 3
- Pivote = 43 < 4, va a la izquierda
- Pivote = 2 (pivote de los que están a la izquierda del 4) → 3 > 2, posición final: entre 2 y 4 - Inserta entre 2 y 4`

  • Complejidad: O(n²) (menos comparaciones en binaria, pero igual desplazamientos)
18
Q

ALGORTIMOS DE ORDENACIÓN: ¿Cómo funciona el algoritmo Merge Sort?

A
  • Pertenece a la categoría divide y vencerás
  • Divide recursivamente la lista en MITADES (❌⚠️ NO como bucket sort que lo hace en CATEGORÍAS) hasta que queden elementos individuales
  • Luego fusiona (merge) esas mitades ordenándolas

Pasos:
- Dividir: separar la lista en mitades
- Ordenar cada mitad de forma recursiva
- Combinar ambas mitades en orden

  • Complejidad: O(n log n) (eficiente incluso en el peor caso)
19
Q

ALGORTIMOS DE ORDENACIÓN: ¿Cómo funciona el algoritmo HeapSort?

A
  • Pertenece a la categoría selection sort
  • Usa una estructura llamada montículo (heap) para ordenar
  • En un montículo, el valor máximo siempre está en la raíz

Pasos:
- Construir un montículo máximo con todos los elementos
- Extraer el valor de la raíz (el mayor) y colocarlo al final
- Reorganizar el montículo (y subir el nuevo montículo)
- Repetir hasta vaciarlo

  • Complejidad: O(n log n)
  • No necesita espacio adicional
20
Q

ALGORTIMOS DE ORDENACIÓN: ¿Cómo funciona el algoritmo de selección? ¿Qué es el candidato prometedor?

A
  • Pertenece a la categoría selection sort
  • Busca en cada pasada el candidato prometedor (el menor de los no ordenados)
  • Lo intercambia con la posición actual

Pasos:
- Recorre toda la lista y selecciona el valor más pequeño
- Lo coloca en la primera posición
- Repite el proceso con el resto de la lista

  • Complejidad: O(n²) (aunque hace menos intercambios que burbuja)
21
Q

ALGORTIMOS DE ORDENACIÓN: ¿Cómo funciona el algoritmo Radix Sort? ¿Cuáles son sus dos variantes?

A
  • Pertenece a la categoría distribution sort
  • Ordena los elementos dígito a dígito, empezando por una posición concreta
  • ❌ No compara elementos enteros como otros algoritmos ⭐️
  • Utiliza almacenamiento adicional como colas o bucket para agrupar los datos temporalmente ⭐️

Variantes:
- LSD (Least Significant Digit): ordena primero por el dígito menos significativo (derecha)
- MSD (Most Significant Digit): comienza por el dígito más significativo (izquierda)

Aspectos clave (más sencillo):
- Cuantos más dígitos tengan los números, más tiempo llevará ordenarlos
- El algoritmo hace una pasada por cada dígito
- Funciona muy bien si todos los números tienen la misma cantidad de dígitos

  • Complejidad: O(n·k)
    (siendo n los elementos y k la cantidad de dígitos por número)

🧠 Ejemplo con [170, 45, 75]

Paso 1 – Unidades (1s):

Ordenamos según el último dígito:
[170, 75, 45] → termina en 0, 5, 5 → orden: [170, 45, 75]

Paso 2 – Decenas (10s):

Dígitos: 7, 4, 7 → orden: [45, 170, 75]

Paso 3 – Centenas (100s):

Dígitos: 0, 1, 0 → orden: [45, 75, 170]

📌 Resultado final: [45, 75, 170]

22
Q

ALGORTIMOS DE ORDENACIÓN: ¿Cómo funcionan los algoritmos Bucket Sort y Bin Sort?

A
  • Pertenecen a la categoría distribution sort
  • Dividen los datos en varios grupos llamados buckets (cubos o contenedores)
  • Cada bucket agrupa elementos que están dentro de un mismo rango
  • Luego se ordena cada bucket (usando otro algoritmo como inserción)

Características clave:
- Muy eficiente si los datos están uniformemente distribuidos
- Ideal para ordenar números en un rango conocido (por ejemplo, entre 0 y 100)
- Bin Sort es una variante muy similar, especialmente usada para enteros

  • Complejidad promedio: O(n + k)
    (n elementos, k número de buckets)
  • En el peor caso: puede llegar a O(n²) si los datos caen todos en un solo bucket
23
Q

BUCLES ¿Qué es un bucle? ¿Cuándo para?

A

Es una estructura que permite repetir una serie de instrucciones varias veces ⭐️⭐️⭐️ hasta que se cumpla una condición

24
Q

BUCLES ¿Qué es un bucle for? ¿Cuántas partes tiene? ¿Cuando es adecuado usarlas?

A

Es un bucle que se repite un número exacto de veces

Tiene 3 partes:
- Inicio: se define una variable (por ejemplo, i = 1)
- Condición: se repite mientras se cumpla (por ejemplo, i ≤ 5)
- Incremento: cambia el valor en cada vuelta (por ejemplo, i++)

Se usa cuando sabemos cuántas veces queremos repetir algo

En este ejemplo, se repite 5 veces porque empieza en 1 y termina cuando i llega a 5

25
**BUCLES** ¿Qué es un `bucle while`? ¿Cuántas partes tiene? ¿En que ocasiones se usa?
Es un `bucle` que se repite mientras se cumpla una `condición` Tiene 3 partes principales: - La `inicialización` va fuera del `bucle` (por ejemplo, `i = 1`) - La `condición` se comprueba antes de cada repetición (por ejemplo, `i ≤ 5`) - El `incremento` va dentro del `bucle` (por ejemplo, `i++`) Se usa cuando `no sabemos exactamente cuántas veces` se va a repetir, ya que `i` está `fuera del bucle` y éste no sabe esa información
26
**BUCLES** Ejemplo `#1`
Función que `suma valores impares` desde 1 mientras sean menores que 7 (`1, 3, 5`) int `j = 0`; // int `i = 1`; // while (i < 7) { `j = j + I`; `i = i + 2`; } Antes → `j = 0` y `i = 1` `Iteración 1` → `j = 1` y `i = 3` `Iteración 2` → `j = 4` y `i = 5` `Iteración 3` → `j = 9` y `i = 7`
27
**RECURSIVIDAD** ¿Qué es una función `recursiva`? ¿Cuál es su principal `requisito`?
Es una función que se llama a `sí misma` para resolver un problema `dividiéndolo en partes más pequeñas` Se repite hasta llegar a un `caso base` que DETIENE TODO. Se usa una `condición` (como un `if`) para parar y no repetir infinitamente Suele ser más `lenta` que otras opciones como los `bucles` 🎯 Entonces: Si hacemos una función recursiva para contar hacia atrás desde 3, esto es lo que hace: 1. Empieza en 3 → lo muestra 2. Llama a sí misma con 2 3. Muestra el 2 4. Llama a sí misma con 1 5. Muestra el 1 6. Llama a sí misma con 0 7. Como 0 es el caso base → ya no hace nada má
28
**EXTRA** ¿Cuál es la fórmula del `n-ésimo` término de la `serie de Fibonacci`?
La fórmula es: `F(n) = F(n−1) + F(n−2)` Cada número se obtiene sumando los dos anteriores Ejemplo: - `F(0) = 0` - `F(1) = 1` - `F(2) = 1` - `F(3) = 2` - `F(4) = 3` - `F(5) = 5` Se puede resolver con `recursividad` o con `programación dinámica`
29
**EXTRA** .Que es una `búsqueda binaria`? ¿Qué es esencial en cuanto a los elementos para mejorar la búsqueda? ¿Qué complejidad logarítmica tiene?
Busca ir moviendo los elementos desde el `pivoté` e ir poniendo a la izquierda los menores y derecha los mayores Ese esencial que los `elementos queden ordenados` Tiene complejidad `O(log n)`
30
**EXTRA** En los `Algoritmos de ordenación` que quiere decir la propiedad de `estabilidad`?
👉 Si dos elementos tienen el mismo valor (son iguales para la comparación), después de ordenar se `mantienen en el mismo orden relativo en el que estaban antes` EJEMPLO: 8 3 3* 1 ➡️ 1 3 3* 8 Mantiene el orden de esos 3 y 3*
31
**EXTRA** "¿Qué ocurre cuando una función llama a otra función? ¿Qué ocurre con los `parámetros` y la `pila de memoria`?
Cuando una función llama a otra, **el programa detiene temporalmente la ejecución de la función actual** 🤚🏻, y **salta a ejecutar la nueva función**. 👉🏻 Cuando la nueva función termina, el programa **retoma la ejecución donde se había quedado** ↩️ en la función original. 🧠 Es como hacer una llamada telefónica: 1. Pausas lo que estás haciendo (función A) 2. Hablas con alguien (función B) 3. Cuando terminas, vuelves a lo tuyo (continúa A)" ✅ ¿Qué pasa con los `parámetros y la pila de memoria`? Cuando se llama a una función: • Los parámetros (los datos que se pasan a la función) **se guardan en la `pila de memoria`**. • Cada llamada de función **crea un nuevo `“marco” o “registro”` en la pila**, que guarda: • Los parámetros • Las variables locales • La dirección de retorno (para saber dónde continuar al volver) Cuando la función **termina** ⛔️, su marco se **elimina de la pila** ❌, y el programa regresa a la función anterior
32
**EXTRA** ¿Qué es la `complejidad espacial` en los algoritmos de ’ordenación`?
Es el `espacio adicional` que necesita el algoritmo de `ordenación` para **ejecutarse** o la `memoria` que gasta.
33
**EXTRA** Define estos `órdenes de complejidad`:
- `Complejidad espacial`: mide cuánta **memoria usa** un algoritmo durante su ejecución. - `Complejidad temporal`: mide cuánto **tiempo tarda un algoritmo en resolverse** según el tamaño de los datos de entrada.
34
**ORDENACIÓN** ¿Qué diferencia hay entre el ciclo de `particionado` y el de `mezcla`?
- `Particionado`: es el proceso de **dividir** una lista grande en partes más pequeñas para poder ordenarlas. Se usa en algoritmos como `quicksort`. - `Mezcla`: es el proceso de **reunir** varias partes ya ordenadas en una sola lista ordenada. Se usa en algoritmos como `merge sort`. ➡️ En resumen: `particionado` divide, `mezcla` une.