Ejercicios

[recusion, stacks] Entender el costo que implica usar el runtime stack. Bajo igualdad condiciones, ¿qué implementación requiere más memoria al ser ejecutada: una implementación iterativa o una recursiva?

[análisis de recursión] Determina el output de foo(0,5). Analiza su complejidad.

void foo(int n, int m  {
  if (n < m) {
    for (int i = 0; i < m; i++) {
        if (i > n) cout << "*";
        else       cout << " ";
    }
  }
}

[infix, postfix] Convierte la siguiente expresión a postfix: 3 * ((7 + 8) / 5)

[árboles binarios] Dado un puntero a nodo de arbol binario, determina si es una lista enlazada, i.e. todo nodo tiene un solo hijo. A continuación, dos ejemplos.

[heap] Añadir al heap una member function decrementElement(int i) que decremente el elemento indice i (y ajuste la estructura para que siga siendo heap). La siguiente figura muestra el heap inicial y luego de que elemento indice 2 ha sido decrementado por 12.

[complejidad recursiva] Determina la complejidad de fah. La función partition devuelve un índice entre low y high y requiere exactamente $n$ pasos, donde $n = high - low + 1$

int fah(int A[], int low, int high, int kth) {
    int i;
    i = partition(A[], low, high);
    if (i == kth)     return A[i];
    else if (i > kth) fah(A, low, i-1);
    else              fah(A, i+1, high);
}

[stacks y queues] Dado un queue de letras minúsculas (no espacios, ni mayúsculas, ni otros símbolos) usa un stack para determinar si el contenido del queue es un palíndromo. A continuación un queue de letras minúsculas que contiene un palíndrom.

[vector] Dado dos strings de letras minúsculas, determina si son anagramas en tiempo $O(n)$. https://es.wikipedia.org/wiki/Anagrama

[queue] Dado un queue con números enteros positivos, ordénalo ascendentemente usando solo otros queues y alguna que otra variable sencilla.

[bst sort] Dada la implementación de un BST usando nodos, añade la función bstSort que devuelve un arreglo de los elementos del BST en orden ascendente.

[priority queue] Supón que deseamos hallar el k-esimo número más grande de un arreglo. Dos formas posibles son:

Presenta un argumento usando complejidad para explicar por qué el segundo método es más eficiente.

[grafos] Dado la implementación de un grafo implementar un member funcion que dado un nodo devuelva todos los elementos que están a distancia 2.

[grafos] Dado la implementación de un grafo implementar un member funcion que determine el max indegree.

[grafos] Un nodo amigable es aquel que tal que tiene al menos $\frac{|V|}{2}$ otros nodos apuntando hacia él. Añade un member function al grafo que determina si un nodo es amigable.

[grafos] Dado la implementación de un grafo implementar un member funcion que determine el diámetro del grafo http://mathworld.wolfram.com/GraphDiameter.html

[árboles binarios] Dado un arreglo basado implementar funciones para determinar:

[grafos] El complemento de un grafo G es un grafo con sus mismos nodos pero que solo tiene las aristas que G no tiene. Por ejemplo, un grafo y su complemento.

Añada un member function complement() a la clase grafo que devuelva su grafo complemento.

[sorting] Dado un arreglo saber ilustrar como se ordena usando mergesort y quicksort.

[heap] Saber aplicar las operaciones de percolate down, percolate up y heapify sobre un arreglo.