Las estructuras lineales se distinguen por su politica de acceso. La pila (stack) opera bajo LIFO (ultimo en entrar, primero en salir), con push y pop en tiempo constante O(1). La cola (queue) sigue FIFO (primero en entrar, primero en salir), con enqueue y dequeue tambien en O(1). En una lista enlazada simple, insertar al inicio cuesta O(1), pero buscar un elemento exige recorrer la lista, O(n) en el peor caso; las variantes dobles y circulares agregan enlaces para recorrer en ambos sentidos o cerrar el ciclo.
Los arboles binarios de busqueda (BST) realizan busqueda, insercion y eliminacion en tiempo proporcional a la altura h: O(log n) si el arbol esta balanceado y O(n) en el peor caso. Insertar una secuencia ya ordenada produce un arbol degenerado equivalente a una lista, con altura n-1. El recorrido inorden (izquierda-raiz-derecha) visita las claves en orden ascendente. Los arboles balanceados (AVL, rojinegros) acotan la altura: un arbol rojinegro con n nodos internos tiene altura menor o igual a 2*log2(n+1), por lo que sus operaciones son O(log n).
Otras estructuras clave y sus costes:
Los recorridos de arboles se nombran segun cuando se visita la raiz: preorden (raiz-izquierda-derecha), inorden (izquierda-raiz-derecha) y postorden (izquierda-derecha-raiz); el recorrido por niveles se implementa con una cola. Sobre grafos con listas de adyacencia, tanto BFS como DFS son lineales, O(V+E). Por ultimo, los caminos minimos se describen con el algoritmo de Dijkstra y el arbol de expansion minima con Prim o Kruskal, que extienden estos recorridos ponderando las aristas.
1. ¿Qué política de acceso caracteriza el comportamiento de una pila (stack) como estructura de datos?
La pila sigue la política LIFO (último en entrar, primero en salir); la política FIFO corresponde a la cola, no a la pila. (CLRS, 3ª ed., cap. 10 (Stacks and queues))
2. ¿Qué política de acceso caracteriza el comportamiento de una cola (queue) como estructura de datos?
La cola sigue la política FIFO (primero en entrar, primero en salir); LIFO corresponde a la pila. (CLRS, 3ª ed., cap. 10 (Stacks and queues))
3. Un desarrollador implementa la función 'deshacer' (undo) de un editor de texto, donde la acción más reciente debe ser la primera en revertirse. ¿Qué estructura de datos es la más adecuada y cuál es el costo de sus operaciones básicas de inserción y eliminación?
El comportamiento 'último en entrar, primero en salir' corresponde a una pila, cuyas operaciones push/pop son O(1); la cola aplicaría el orden inverso (FIFO). (CLRS, 3ª ed., cap. 10 (Stacks and queues))
4. Un sistema de impresión debe procesar los documentos exactamente en el mismo orden en que fueron enviados por los usuarios, sin alterar la secuencia de llegada. ¿Qué estructura de datos y política de acceso implementan correctamente este requisito?
Procesar en el mismo orden de llegada corresponde a la política FIFO propia de la cola; la pila invertiría el orden de atención. (CLRS, 3ª ed., cap. 10 (Stacks and queues))
5. ¿Cuál es el costo temporal de las operaciones push y pop sobre una pila implementada con un arreglo o con una lista enlazada?
Push y pop operan siempre sobre el tope de la pila, sin recorrer el resto de la estructura, por lo que su costo es constante. (CLRS, 3ª ed., cap. 10 (Stacks and queues))
6. ¿Cuál de las siguientes operaciones sobre una pila implementada con una lista enlazada NO tiene costo O(1)?
Push, pop y peek actúan solo sobre el tope en tiempo constante; buscar un elemento arbitrario exige recorrer la pila en el peor caso, es decir O(n). (CLRS, 3ª ed., cap. 10 (Stacks and queues))
7. En una lista enlazada simple, ¿cuál es el costo de insertar un nuevo elemento al inicio de la lista?
Insertar al inicio solo requiere actualizar el apuntador de cabeza, sin recorrer la lista, por lo que el costo es constante. (CLRS, 3ª ed., cap. 10 (Linked lists))
8. Una aplicación guarda su historial de eventos en una lista enlazada simple no ordenada. Cuando el sistema necesita verificar si un evento con una clave específica ya fue registrado, ¿cuál es el costo, en el peor caso, de dicha verificación?
Al no estar ordenada, la única forma de verificar la presencia de una clave es recorrer secuencialmente la lista hasta encontrarla o llegar al final, es decir O(n). (CLRS, 3ª ed., cap. 10 (Linked lists))
9. ¿Cuál es el costo de insertar un nuevo elemento en un montículo (heap) binario con n elementos?
Insertar requiere colocar el elemento en la última posición y luego 'flotarlo' hasta restaurar la propiedad de montículo, un proceso proporcional a la altura del árbol, O(log n). (CLRS, 3ª ed., cap. 6 y 6.5 (Priority queues))
10. ¿Cuál es el costo de consultar, sin eliminarlo, el elemento de mayor prioridad almacenado en un montículo binario?
El elemento de mayor prioridad siempre se encuentra en la raíz del montículo, por lo que consultarlo (sin eliminarlo) es de costo constante. (CLRS, 3ª ed., cap. 6.5 (Priority queues))
11. ¿Cuál es el costo de extraer el elemento de mayor prioridad (extract-max o extract-min) de un montículo binario con n elementos, considerando que después de la extracción debe restaurarse la propiedad de montículo?
Tras mover el último elemento a la raíz, este debe hundirse por la ruta adecuada hasta restaurar la propiedad de montículo, en tiempo proporcional a la altura, O(log n). (CLRS, 3ª ed., cap. 6 (Heapsort) y 6.5 (Priority queues))
12. ¿Cuál es el costo de construir un montículo binario a partir de un arreglo desordenado de n elementos mediante el procedimiento BUILD-HEAP, que aplica el proceso de restauración de la propiedad de montículo de abajo hacia arriba?
Aunque una cota ingenua sugiere O(n log n), el análisis muestra que la mayoría de los nodos están cerca de las hojas y requieren pocos intercambios, por lo que el costo total de BUILD-HEAP es O(n). (CLRS, 3ª ed., cap. 6 (Heapsort), análisis de BUILD-HEAP)
13. Un sistema de gestión hospitalaria debe atender primero al paciente cuya condición sea más crítica, sin importar el orden en que haya llegado. ¿Qué estructura de datos resulta más adecuada para implementar esta política de atención?
Cuando el criterio de atención es la prioridad (gravedad) y no el orden de llegada, la estructura adecuada es una cola de prioridad basada en un montículo. (CLRS, 3ª ed., cap. 6.5 (Priority queues))
14. Un programador necesita una estructura que permita extraer repetidamente el elemento mínimo en tiempo logarítmico y que se pueda construir a partir de un arreglo desordenado con menor costo, sin requerir que todos los elementos permanezcan totalmente ordenados en todo momento. ¿Qué estructura satisface mejor este requisito?
El montículo mínimo mantiene solo la propiedad parcial de orden (padre menor o igual que hijos) y se construye en O(n) mediante BUILD-HEAP, mientras que un BST balanceado o estructuras totalmente ordenadas imponen un costo mayor. (CLRS, 3ª ed., cap. 6 (Heapsort) y cap. 13 (Red-black trees))
15. De las siguientes operaciones sobre un montículo binario, ¿cuál NO se ejecuta en tiempo O(log n)?
Consultar la raíz del montículo es de costo constante O(1); insertar, extraer y reordenar tras un cambio de prioridad requieren recorrer la altura del árbol, O(log n). (CLRS, 3ª ed., cap. 6.5 (Priority queues))
16. ¿Qué propiedad debe cumplir un montículo máximo (max-heap) respecto a un nodo padre y sus hijos?
En un montículo máximo, cada nodo padre debe tener una clave mayor o igual que la de cada uno de sus hijos, lo que garantiza que el máximo se ubique siempre en la raíz. (CLRS, 3ª ed., cap. 6 (Heapsort), propiedad de montículo)
17. ¿Cuál es la principal diferencia funcional entre una cola de prioridad implementada con un montículo y una cola simple de tipo FIFO?
La cola de prioridad selecciona el elemento con mayor (o menor) prioridad sin importar cuándo llegó, mientras que la cola FIFO respeta estrictamente el orden de llegada. (CLRS, 3ª ed., cap. 6.5 (Priority queues) y cap. 10 (Stacks and queues))
18. ¿En qué orden visita los nodos el recorrido inorden (in-order) de un árbol binario?
El recorrido inorden visita primero el subárbol izquierdo, luego la raíz y finalmente el subárbol derecho; sobre un BST esto produce las claves en orden ascendente. (CLRS, 3ª ed., cap. 12, procedimiento INORDER-TREE-WALK)
19. ¿En qué orden visita los nodos el recorrido preorden (pre-order) de un árbol binario?
El recorrido preorden visita primero la raíz, después el subárbol izquierdo y por último el subárbol derecho. (CLRS, 3ª ed., cap. 12 (Binary search trees))
20. ¿En qué orden visita los nodos el recorrido postorden (post-order) de un árbol binario?
El recorrido postorden visita primero ambos subárboles y, al final, la raíz. (CLRS, 3ª ed., cap. 12 (Binary search trees))
21. Un analista de datos requiere obtener el listado de claves almacenadas en un árbol binario de búsqueda (BST) en orden ascendente, sin necesidad de ordenarlas después de extraerlas. ¿Qué recorrido debe aplicar sobre el árbol para lograrlo directamente?
En un BST, el recorrido inorden visita las claves en orden ascendente de manera natural, sin requerir un paso adicional de ordenamiento. (CLRS, 3ª ed., cap. 12, procedimiento INORDER-TREE-WALK)
22. Un ingeniero de software necesita explorar un grafo nivel por nivel, de manera que se visiten primero todos los vértices más cercanos al origen antes que los más lejanos. ¿Qué estructura de datos auxiliar debe emplear para lograr este comportamiento?
El recorrido por niveles característico de BFS se implementa con una cola FIFO, que garantiza procesar los vértices en el orden en que se descubren por distancia creciente. (CLRS, 3ª ed., cap. 22 (Breadth-first search))
23. Si un grafo con V vértices se representa mediante una MATRIZ de adyacencia en lugar de listas de adyacencia, ¿cuál es el costo temporal de un recorrido BFS o DFS completo sobre ese grafo?
Con matriz de adyacencia, determinar los vecinos de un vértice exige recorrer una fila completa de tamaño V, por lo que el recorrido completo cuesta O(V²), a diferencia del O(V+E) que se logra con listas de adyacencia. (CLRS, 3ª ed., cap. 22 (representación de grafos y recorridos))
24. Un ingeniero debe encontrar la ruta con el menor número de aristas entre dos vértices de un grafo no ponderado. ¿Qué algoritmo de recorrido debe utilizar para garantizar dicha propiedad?
BFS explora el grafo por niveles de distancia, por lo que la primera vez que alcanza un vértice lo hace mediante el camino con el menor número de aristas; DFS no garantiza esta propiedad. (CLRS, 3ª ed., cap. 22 (Breadth-first search, camino más corto no ponderado))
25. Durante la ejecución de DFS sobre un grafo dirigido representado con listas de adyacencia, el algoritmo alcanza un vértice que ya fue visitado y que todavía permanece activo en la pila de llamadas recursivas (es decir, es antecesor del vértice actual en el árbol de recorrido). ¿Qué tipo de arista se identifica en este caso?
Una arista que conecta un vértice con un antecesor todavía activo en la recursión se clasifica como arista de retroceso; las de árbol, avance y cruce corresponden a otras relaciones entre vértices descubiertos. (CLRS, 3ª ed., cap. 22 (Depth-first search, clasificación de aristas))
26. Un grafo NO dirigido tiene 6 vértices y 9 aristas, y se representa mediante listas de adyacencia. ¿Cuál es la suma total del número de elementos (vecinos) que aparecen a lo largo de las listas de adyacencia de todos los vértices?
En un grafo no dirigido, cada arista aparece en las listas de adyacencia de sus dos extremos, por lo que la suma total de longitudes es 2|E| = 2 × 9 = 18. (CLRS, 3ª ed., cap. 22 (representación mediante listas de adyacencia))
27. En una lista enlazada simple, cada nodo mantiene un único apuntador que hace referencia exclusivamente a...
Por definición, en una lista simplemente enlazada cada nodo solo almacena la dirección del nodo siguiente; acceder al anterior exigiría un apuntador adicional, propio de la lista doble. (Weiss, 'Data Structures and Algorithm Analysis', cap. 3 (Lists, Stacks, and Queues); CLRS, 'Introduction to Algorithms', 3ª ed., cap. 10)
28. En una lista enlazada simple no ordenada, insertar un nuevo nodo justo después de la cabecera (es decir, al inicio de la lista) tiene un costo de tiempo de...
Insertar al inicio solo exige reasignar dos apuntadores, sin importar el tamaño de la lista, por lo que el costo es constante. (CLRS, 'Introduction to Algorithms', 3ª ed., cap. 10 (Linked lists))
29. ¿Cuál es el costo, en el peor de los casos, de buscar un valor específico dentro de una lista enlazada simple con n nodos?
Sin apuntadores adicionales ni orden que permita saltos, la búsqueda debe recorrer, en el peor caso, los n nodos uno por uno. (CLRS, 'Introduction to Algorithms', 3ª ed., cap. 10 (Linked lists))
30. Un desarrollador cuenta únicamente con un apuntador al nodo que desea eliminar de una lista SIMPLEMENTE enlazada; no tiene el apuntador al nodo anterior ni a la cabecera. Si solo puede reasignar apuntadores para desenlazar ese nodo (sin copiar datos de otro nodo), ¿cuál es la razón por la que no logra completar la eliminación en tiempo constante?
En una lista simple, únicamente el nodo anterior conoce la referencia que debe modificarse para saltar al nodo eliminado; sin ese apuntador hay que recorrer la lista desde la cabecera, lo que hace el costo lineal, no constante. (CLRS, 'Introduction to Algorithms', 3ª ed., cap. 10 (limitación estructural de la lista simple frente a la doble))
31. En una lista doblemente enlazada, cada nodo mantiene, además del apuntador al nodo siguiente, un apuntador adicional que hace referencia a...
La característica que define a la lista doble es el segundo apuntador hacia el nodo previo, lo que habilita el recorrido en ambos sentidos. (Weiss, 'Data Structures and Algorithm Analysis', cap. 3; CLRS, 'Introduction to Algorithms', 3ª ed., cap. 10)
32. ¿Cuál es la ventaja principal de una lista doblemente enlazada frente a una lista simplemente enlazada al recorrer o modificar sus elementos?
El apuntador al nodo anterior permite recorrer en reversa y acceder al predecesor directamente; la búsqueda sigue siendo O(n) en ambas variantes, por lo que no se reduce a O(log n). (Weiss, 'Data Structures and Algorithm Analysis', cap. 3; CLRS, 'Introduction to Algorithms', 3ª ed., cap. 10)
33. En una lista circular simplemente enlazada, el apuntador 'siguiente' del último nodo hace referencia a...
Lo que distingue a la lista circular es que el último nodo cierra el ciclo apuntando de vuelta al primero, sin que exista ningún apuntador nulo dentro de la estructura. (Weiss, 'Data Structures and Algorithm Analysis', cap. 3 (Circular linked lists))
34. En una lista circular doblemente enlazada se mantiene un único apuntador externo que referencia al nodo 'cola' (tail). Gracias a esa única referencia, ¿qué operaciones pueden realizarse en tiempo constante?
Como la lista es circular, tail->next apunta a la cabeza y tail->prev al penúltimo nodo, de modo que un solo apuntador basta para insertar o eliminar en O(1) tanto al inicio como al final. (CLRS, 'Introduction to Algorithms', 3ª ed., cap. 10 (ejercicios sobre listas circulares); Weiss cap. 3)
35. ¿Cuál de las siguientes afirmaciones sobre una lista circular simplemente enlazada NO es correcta?
La circularidad cambia la forma de recorrer la lista, pero no acelera la búsqueda: esta sigue siendo O(n) en el peor caso, igual que en una lista simple, pues no existe ningún mecanismo de orden o salto. (Weiss, 'Data Structures and Algorithm Analysis', cap. 3; CLRS, 'Introduction to Algorithms', 3ª ed., cap. 10)