B2-T3: ESTRUCTURAS DE DATOS, ALGORITMOS Y FICHEROS

Tema fundamental y muy preguntado. Las complejidades de los algoritmos de ordenación son casi fijas en el examen TAI. Los árboles binarios de búsqueda (BST), los AVL y los B/B+ son recurrentes. También preguntan sobre recorridos de grafos (DFS/BFS) y organización de ficheros (secuencial, indexado, hash). Memoriza las tablas comparativas de complejidad.

COMPLEJIDAD ALGORÍTMICA

Notación asintótica

La notación Big O describe el comportamiento asintótico del tiempo (o espacio) de ejecución de un algoritmo en función del tamaño de la entrada n. Se usa para analizar el peor caso.

NotaciónSignificadoUso
O(f(n)) — Big OCota superior asintótica (peor caso)La más usada. "A lo sumo" crece como f(n)
Ω(f(n)) — OmegaCota inferior asintótica (mejor caso)"Al menos" crece como f(n)
Θ(f(n)) — ThetaCota ajustada (mejor y peor coinciden)Complejidad exacta asintótica
o(f(n)) — Little-oEstrictamente menor que f(n)Crece más lento que f(n)

Órdenes de complejidad (de mejor a peor)

ComplejidadNombreEjemplo para n=1.000Ejemplo de algoritmo
O(1)Constante1Acceso a array por índice, hash table lookup
O(log n)Logarítmica~10Búsqueda binaria, operaciones en árboles balanceados
O(n)Lineal1.000Búsqueda secuencial, recorrido de lista
O(n log n)Lineal-logarítmica~10.000Mergesort, Heapsort, Quicksort (promedio)
O(n²)Cuadrática1.000.000Bubble sort, Insertion sort (peor caso)
O(n³)Cúbica10⁹Multiplicación de matrices naive, Floyd-Warshall
O(2ⁿ)Exponencial~10³⁰¹Subconjuntos, fuerza bruta combinatoria
O(n!)FactorialAstronómicaPermutaciones, TSP por fuerza bruta
Regla clave: O(1) < O(log n) < O(n) < O(n log n) < O(n²) < O(n³) < O(2ⁿ) < O(n!). Un algoritmo O(n log n) es generalmente óptimo para ordenación por comparación (demostrado como cota inferior teórica).

ESTRUCTURAS DE DATOS LINEALES

Arrays (vectores y matrices)

CaracterísticaDescripción
DefiniciónColección de elementos del mismo tipo almacenados en posiciones contiguas de memoria
AccesoO(1) — acceso directo por índice (base + desplazamiento)
BúsquedaO(n) secuencial; O(log n) si está ordenado (búsqueda binaria)
Inserción/eliminaciónO(n) — requiere desplazar elementos
TamañoFijo en tiempo de compilación (estático) o dinámico (con reasignación)
VentajaAcceso rápido, buen uso de caché (localidad espacial)
DesventajaTamaño fijo, inserción/eliminación costosas

Listas enlazadas

TipoEstructuraNavegaciónUso típico
Simple (singly linked)Nodo → [dato | siguiente]Solo hacia adelantePilas, colas simples
Doble (doubly linked)← [anterior | dato | siguiente] →BidireccionalNavegación adelante/atrás, editores de texto
CircularEl último nodo apunta al primeroCíclicaBuffers circulares, round-robin
OperaciónLista enlazadaArray
Acceso por índiceO(n)O(1)
Inserción al inicioO(1)O(n)
Inserción al finalO(n) / O(1) con puntero al finalO(1) amortizado
EliminaciónO(1) si tenemos referencia al nodoO(n) (desplazar)
BúsquedaO(n)O(n) / O(log n) ordenado
Uso de memoriaOverhead por punterosCompacto, buena localidad de caché

Pilas (stacks)

PropiedadDescripción
DisciplinaLIFO (Last In, First Out) — el último en entrar es el primero en salir
Operacionespush (apilar), pop (desapilar), peek/top (ver tope sin extraer)
Complejidadpush, pop y peek: O(1)
ImplementaciónArray (puntero al tope) o lista enlazada simple
AplicacionesPila de llamadas a funciones (call stack), evaluación de expresiones postfijas, undo/redo, parsers, verificación de paréntesis balanceados, backtracking, DFS iterativo

Colas (queues)

TipoDisciplinaOperacionesAplicación
Cola simpleFIFO (First In, First Out)enqueue (encolar), dequeue (desencolar)Buffers de impresión, planificación de procesos
Cola de prioridadSale primero el de mayor (o menor) prioridadinsert, extractMin/MaxDijkstra, planificación de tareas, heaps
Cola doble (deque)Inserción/extracción por ambos extremospushFront, pushBack, popFront, popBackSliding window, palíndromos
Cola circularFIFO con buffer circular (array)Índices front/rear con móduloBuffers de E/S, colas de tamaño fijo
Examen: Pila = LIFO. Cola = FIFO. Las colas de prioridad se implementan típicamente con un heap binario (insert y extract en O(log n)). No confundir cola de prioridad con cola ordenada — la cola de prioridad no mantiene todos los elementos ordenados, solo garantiza el máximo/mínimo.

ESTRUCTURAS DE DATOS NO LINEALES

Árboles: conceptos fundamentales

TérminoDefinición
RaízNodo sin padre (parte superior del árbol)
HojaNodo sin hijos (nodo terminal)
Nodo internoNodo con al menos un hijo
Profundidad de un nodoNúmero de aristas desde la raíz hasta ese nodo
Altura del árbolMáxima profundidad entre todas las hojas
Grado de un nodoNúmero de hijos directos
Grado del árbolMáximo grado entre todos los nodos
SubárbolÁrbol formado por un nodo y todos sus descendientes
BosqueConjunto de árboles disjuntos

Tipos de árboles

TipoDescripciónAlturaUso
Árbol binarioCada nodo tiene máximo 2 hijos (izquierdo/derecho)VariableBase para BST, heaps, expresiones
BST (Binary Search Tree)Izq < raíz < der para todo nodoO(n) peor, O(log n) promedioDiccionarios, conjuntos
AVLBST autobalanceado: |h(izq) - h(der)| ≤ 1O(log n) garantizadoBúsqueda frecuente
Rojo-NegroBST autobalanceado con nodos rojo/negro y reglas de colorO(log n) (menos estricto que AVL)Librerías estándar (TreeMap, std::map)
Heap binarioÁrbol binario completo; padre ≥ hijos (max-heap) o ≤ (min-heap)O(log n)Colas de prioridad, Heapsort
Árbol BGeneralización balanceada: nodo con m claves y m+1 hijosO(log n) con base altaÍndices de BBDD, sistemas de ficheros
Árbol B+Datos SOLO en hojas (nodos internos = solo claves). Hojas enlazadas para búsquedas de rango. Clave: Árbol B tiene datos en todos los nodos; Árbol B+ solo en hojasO(log n)Índices en BBDD (MySQL InnoDB, PostgreSQL)
Trie (prefix tree)Cada arista representa un carácter; nodos compartidos por prefijoO(longitud de la clave)Autocompletado, diccionarios, routing IP
Examen: En un AVL, si la diferencia de alturas supera 1, se rebalancean con rotaciones (simple o doble, izquierda o derecha). En un B-tree de orden m, cada nodo interno tiene entre ⌈m/2⌉ y m hijos. El B+ es el preferido en BBDD porque las hojas enlazadas permiten recorridos secuenciales eficientes (range scans).

Rotaciones AVL

Caso de desbalanceoRotaciónDescripción
Izquierda-Izquierda (LL)Rotación simple a la derechaEl subárbol izquierdo del hijo izquierdo causó el desbalanceo
Derecha-Derecha (RR)Rotación simple a la izquierdaEl subárbol derecho del hijo derecho causó el desbalanceo
Izquierda-Derecha (LR)Rotación doble: izquierda + derechaPrimero rota el hijo izquierdo a la izquierda, luego la raíz a la derecha
Derecha-Izquierda (RL)Rotación doble: derecha + izquierdaPrimero rota el hijo derecho a la derecha, luego la raíz a la izquierda

Recorridos de árboles binarios

RecorridoOrden de visitaAplicación
Preorden (NID)Nodo → Izquierdo → DerechoCopiar/serializar el árbol, expresiones prefijas
Inorden (IND)Izquierdo → Nodo → DerechoObtener elementos ordenados en un BST
Postorden (IDN)Izquierdo → Derecho → NodoLiberar memoria, evaluación de expresiones postfijas
Por niveles (BFS)Nivel 0, nivel 1, nivel 2…Impresión por niveles, búsqueda en anchura
Examen: El recorrido inorden de un BST produce los elementos en orden ascendente. Es la forma más directa de verificar si un árbol binario es un BST válido.

Grafos

Un grafo G = (V, E) consta de un conjunto de vértices (V) y un conjunto de aristas (E) que conectan pares de vértices.

TipoDescripción
Dirigido (digrafo)Las aristas tienen dirección (A → B ≠ B → A)
No dirigidoLas aristas no tienen dirección (A — B = B — A)
PonderadoLas aristas tienen un peso/coste asociado
ConexoExiste camino entre cualquier par de vértices
AcíclicoNo contiene ciclos
DAGDirected Acyclic Graph — dirigido sin ciclos
CompletoCada vértice está conectado con todos los demás (n(n-1)/2 aristas)
BipartitoVértices divisibles en dos grupos sin aristas internas
ÁrbolGrafo conexo acíclico (n vértices, n-1 aristas)

Representación de grafos

RepresentaciónEspacioComprobar aristaListar vecinosMejor para
Matriz de adyacenciaO(V²)O(1)O(V)Grafos densos (muchas aristas)
Lista de adyacenciaO(V + E)O(grado)O(grado)Grafos dispersos (pocas aristas)
Matriz de incidenciaO(V × E)O(E)O(E)Análisis matemático de grafos

Algoritmos fundamentales de grafos

AlgoritmoTipoComplejidadDescripción
BFS (Breadth-First Search)Recorrido en anchuraO(V + E)Usa cola (FIFO). Encuentra camino más corto en grafos no ponderados
DFS (Depth-First Search)Recorrido en profundidadO(V + E)Usa pila (LIFO) o recursión. Detecta ciclos, ordenación topológica
DijkstraCamino más corto (origen único)O((V + E) log V) con heapPesos no negativos. Usa cola de prioridad (min-heap)
Bellman-FordCamino más corto (origen único)O(V × E)Acepta pesos negativos. Detecta ciclos negativos
Floyd-WarshallCamino más corto (todos los pares)O(V³)Programación dinámica. Acepta pesos negativos
KruskalÁrbol de expansión mínima (MST)O(E log E)Ordena aristas por peso, usa Union-Find. Grafo disperso
PrimÁrbol de expansión mínima (MST)O((V + E) log V) con heapCrece el árbol desde un vértice. Grafo denso
Ordenación topológicaOrden lineal de DAGO(V + E)Basado en DFS o algoritmo de Kahn. Scheduling de tareas
Examen: BFS usa cola, DFS usa pila — pregunta clásica. Dijkstra NO funciona con pesos negativos (usar Bellman-Ford). Floyd-Warshall es para TODOS los pares de caminos más cortos. MST: Kruskal ordena aristas (bueno para dispersos), Prim crece desde un vértice (bueno para densos).

TABLAS HASH

Concepto y operaciones

Una tabla hash (hash table / hash map) es una estructura que asocia claves a valores usando una función hash que mapea la clave a una posición del array subyacente.

OperaciónCaso promedioPeor caso
BúsquedaO(1)O(n) (todas las claves colisionan)
InserciónO(1)O(n)
EliminaciónO(1)O(n)

Resolución de colisiones

MétodoDescripciónVentajaDesventaja
Encadenamiento (chaining)Cada posición del array es una lista enlazada con todos los elementos que colisionanSimple, funciona bien con alto factor de cargaUso de memoria extra para punteros
Direccionamiento abierto — Sondeo linealSi la posición h(k) está ocupada, probar h(k)+1, h(k)+2, …Buena localidad de cachéClustering primario (agrupamiento)
Direccionamiento abierto — Sondeo cuadráticoProbar h(k)+1², h(k)+2², h(k)+3², …Reduce clustering primarioClustering secundario, no garantiza cobertura total
Doble hashingUsar segunda función hash: h(k) + i × h₂(k)Distribuye mejor las colisionesRequiere dos funciones hash buenas
El factor de carga (α) = nº elementos / tamaño tabla. Con encadenamiento, rendimiento se degrada gradualmente. Con direccionamiento abierto, se recomienda α < 0.7. Cuando se supera el umbral, se hace rehashing: se crea una tabla más grande (típicamente 2×) y se reinsertan todos los elementos.

Funciones hash comunes

FunciónDescripciónUso
Móduloh(k) = k mod m (m primo ideal)Hash de enteros, base de muchas implementaciones
Multiplicaciónh(k) = ⌊m × (k × A mod 1)⌋ (0 < A < 1)Distribución más uniforme que módulo
Hash de cadenasPolinómica: h = Σ(s[i] × p^i) mod mStrings, claves alfanuméricas

ALGORITMOS DE ORDENACIÓN

Comparativa de algoritmos de ordenación

AlgoritmoMejor casoCaso medioPeor casoEspacioEstableMétodo
Bubble SortO(n)O(n²)O(n²)O(1)Intercambio
Selection SortO(n²)O(n²)O(n²)O(1)NoSelección
Insertion SortO(n)O(n²)O(n²)O(1)Inserción
Shell SortO(n log n)Depende de gapsO(n²) – O(n^1.5)O(1)NoInserción con gaps
Merge SortO(n log n)O(n log n)O(n log n)O(n)Divide y vencerás
Quick SortO(n log n)O(n log n)O(n²)O(log n)NoDivide y vencerás (partición)
Heap SortO(n log n)O(n log n)O(n log n)O(1)NoSelección con heap
Counting SortO(n + k)O(n + k)O(n + k)O(k)No comparativo (conteo)
Radix SortO(d × (n + k))O(d × (n + k))O(d × (n + k))O(n + k)No comparativo (dígito a dígito)
Bucket SortO(n + k)O(n + k)O(n²)O(n + k)No comparativo (distribución)

Detalles de los principales algoritmos

AlgoritmoCómo funcionaCuándo usarlo
Bubble SortCompara pares adyacentes y los intercambia si están desordenados. Repite pasadas hasta que no haya intercambiosSolo educativo — ineficiente para cualquier uso real
Insertion SortInserta cada elemento en su posición correcta dentro de la porción ya ordenadaArrays pequeños (<20 elementos) o casi ordenados
Merge SortDivide el array en mitades recursivamente, ordena cada mitad y fusiona (merge) las mitades ordenadasCuando se necesita estabilidad y rendimiento garantizado O(n log n)
Quick SortElige un pivote, particiona el array en menores/mayores que el pivote, y ordena recursivamenteUso general — el más rápido en práctica (buena localidad de caché)
Heap SortConstruye un max-heap y extrae sucesivamente el máximoCuando se necesita O(n log n) garantizado sin memoria extra
Counting SortCuenta ocurrencias de cada valor y reconstruye el array ordenadoEnteros en un rango pequeño [0, k] con k = O(n)
Radix SortOrdena dígito a dígito (LSD o MSD) usando un sort estable (counting) como subrutinaEnteros/strings de longitud fija, d dígitos
Examen: Los algoritmos no comparativos (counting, radix, bucket) pueden romper la barrera O(n log n) pero solo funcionan con datos de tipo específico. Quick Sort es el más usado en la práctica (stdlib de C usa una variante). Merge Sort es el preferido para listas enlazadas (no necesita acceso aleatorio). Un algoritmo es estable si mantiene el orden relativo de elementos con claves iguales.

ALGORITMOS DE BÚSQUEDA

AlgoritmoRequisitoComplejidadDescripción
Búsqueda secuencialNingunoO(n)Recorre uno a uno hasta encontrar o llegar al final
Búsqueda binariaArray ordenadoO(log n)Divide el espacio de búsqueda a la mitad en cada paso
Búsqueda por interpolaciónArray ordenado, distribución uniformeO(log log n) promedioEstima la posición proporcional al valor buscado
Búsqueda hashTabla hash construidaO(1) promedioAplica función hash a la clave
Búsqueda en árbol (BST)BST construidoO(log n) promedio, O(n) peorCompara con raíz y desciende izquierda/derecha
Búsqueda en árbol balanceadoAVL / Red-BlackO(log n) garantizadoIgual que BST pero con altura garantizada

RECURSIVIDAD Y TÉCNICAS ALGORÍTMICAS

Recursividad

ConceptoDescripción
DefiniciónFunción que se llama a sí misma con un subproblema más pequeño
Caso baseCondición de parada que evita recursión infinita
Caso recursivoLlamada a sí misma con entrada reducida
Pila de llamadasCada llamada recursiva añade un frame al call stack (riesgo de stack overflow)
Tail recursionLa llamada recursiva es la última operación — el compilador puede optimizarla a un bucle

Paradigmas algorítmicos

ParadigmaDescripciónEjemplo clásico
Fuerza brutaProbar todas las soluciones posiblesBúsqueda secuencial, TSP exhaustivo
Divide y vencerásDividir el problema en subproblemas, resolver recursivamente, combinar resultadosMerge sort, Quick sort, búsqueda binaria
Programación dinámicaResolver subproblemas solapados una sola vez, almacenando resultados (memoización/tabulación)Fibonacci, mochila (knapsack), Floyd-Warshall, LCS
Algoritmos voraces (greedy)Elegir siempre la opción localmente óptima, sin retrocederDijkstra, Kruskal, Prim, Huffman
BacktrackingExploración sistemática con retroceso cuando se detecta camino sin salidaN-reinas, sudoku, laberintos
Branch and BoundBacktracking con poda basada en cotas (bound) del costeTSP, problema de asignación
Examen: Divide y vencerás → subproblemas independientes. Programación dinámica → subproblemas solapados (se repiten). La clave de la PD es que almacena resultados intermedios para no recalcularlos. Greedy no garantiza óptimo global en general, pero sí en casos específicos (Dijkstra, Huffman).

ORGANIZACIÓN DE FICHEROS

Tipos de organización

OrganizaciónAccesoDescripciónVentajaDesventaja
SecuencialSecuencialRegistros almacenados uno tras otro en el orden de inserciónSimple, eficiente para procesamiento por lotesBúsqueda lenta O(n), inserción al final
Secuencial indexado (ISAM)Secuencial + directoFichero ordenado por clave + índice con punteros a bloquesBúsqueda O(log n) por índice, recorrido secuencial eficienteDegradación con inserciones (overflow)
IndexadoDirecto por índiceÍndice completo (una entrada por registro) o dispersoBúsqueda rápida, múltiples índices posiblesOverhead de mantener índices
Directo / HashDirectoPosición calculada mediante función hash sobre la claveAcceso O(1) promedioColisiones, no soporta recorrido ordenado
Relativo (direccionamiento relativo)DirectoAcceso por número de registro relativo (RRN)Acceso directo O(1) sin función hashRequiere conocer el RRN

Índices en bases de datos

Tipo de índiceEstructuraDescripción
Índice primarioÁrbol B+Sobre la clave primaria; el fichero está ordenado físicamente por esa clave (índice clustered)
Índice secundarioÁrbol B+Sobre un atributo no clave; el fichero NO está ordenado por ese atributo (non-clustered)
Índice densoVariableUna entrada de índice por cada registro del fichero
Índice dispersoVariableUna entrada por cada bloque (o grupo de registros) del fichero
Índice hashTabla hashAcceso directo por igualdad (no soporta rangos)
Índice bitmapMapa de bitsUn bit por registro para cada valor del atributo. Ideal para atributos con pocos valores distintos (género, estado)
Examen: Índice clustered = 1 por tabla (el fichero está ordenado físicamente por esa clave). Non-clustered = múltiples por tabla. Los SGBD modernos (MySQL InnoDB, PostgreSQL) usan árboles B+ como estructura de índice por defecto. El índice hash solo sirve para búsquedas por igualdad exacta, no para rangos (WHERE x BETWEEN a AND b).


FUENTES PÚBLICAS

Este resumen ha sido elaborado íntegramente a partir de fuentes de dominio público. No se ha utilizado material con copyright de terceros ni material de preparadores.
FuenteTipoReferencia
Conceptos algorítmicos — CLRS, KnuthConocimiento académicoDominio público
Dijkstra — Algoritmos y semáforosPublicación académicaDominio público
Teoría de grafos y complejidadConocimiento académicoDominio público

¿Quieres practicar este tema con tests?

MIMIR tiene más de 5.000 preguntas verificadas, simulacros con penalización real y chat IA que resuelve tus dudas sobre este tema.

Abrir MIMIR gratis →