Problema 3 · Programació II UDL 2010

Tema: Recursión: diseño, traza y diagramas de llamadas · Del examen Examen Primer Parcial Noviembre 2010 (2010)

Enunciado

Problema 3. Búsqueda binaria recursiva de coincidencia en vectores ordenados

Dados dos vectores de enteros con la misma longitud, donde uno está ordenado de manera creciente ( asc) y el otro de forma decreciente ( desc), se desea diseñar un método que determine si existe algún índice en el que ambos vectores contengan el mismo valor (por ejemplo, que exista una posición 3 tal que asc[3] == desc[3]).

La signatura del método principal es:

public boolean crossed(int[] asc, int[] desc)

Para conseguir una implementación eficiente aplicando la estrategia de búsqueda binaria, empleamos dos índices para acotar el rango de búsqueda en cada paso:

public boolean crossed(int[] asc, int[] desc, int left, int right)

a.

Diseñar la función recursiva crossed(int[] asc, int[] desc, int left, int right), justificando la validez del descarte de mitades apoyándose en las propiedades de ordenación de los vectores.

public boolean crossed(int[] asc, int[] desc, int left, int right) {

}

b.

Definir la invocación inicial desde crossed(int[] asc, int[] desc) para abarcar ambos vectores al completo.

public boolean crossed(int[] asc, int[] desc) {

}

Enunciado: Problema 3 · Programació II UDL 2010

Solución

Según los criterios oficiales de corrección

a. Justificación conceptual del descarte de mitades en crossed(int[] asc, int[] desc, int left, int right)

Solución: Definimos la función de diferencia para cada índice ii: D(i)=asc[i]−desc[i]D(i) = asc[i] - desc[i]. Dado que ascasc es monótonamente creciente (asc[i]≤asc[i+1]asc[i] \le asc[i+1]) y descdesc es monótonamente decreciente (desc[i]≥desc[i+1]desc[i] \ge desc[i+1]), la función D(i)D(i) es monótona estrictamente no decreciente: si i<ji < j, entonces D(i)≤D(j)D(i) \le D(j). Buscamos si existe un índice donde D(i)=0D(i) = 0. En cada paso calculamos mid=(left+right)/2mid = (left + right) / 2: - Si asc[mid]==desc[mid]asc[mid] == desc[mid]: se ha encontrado el índice, retornamos true. - Si asc[mid]<desc[mid]asc[mid] < desc[mid] (D(mid)<0D(mid) < 0): para cualquier i<midi < mid se cumple asc[i]≤asc[mid]<desc[mid]≤desc[i]asc[i] \le asc[mid] < desc[mid] \le desc[i], por lo que nunca podrá cumplirse la igualdad; descartamos la mitad izquierda y buscamos recursivamente en la derecha (mid+1mid + 1, rightright). - Si asc[mid]>desc[mid]asc[mid] > desc[mid] (D(mid)>0D(mid) > 0): para cualquier i>midi > mid se cumple asc[i]≥asc[mid]>desc[mid]≥desc[i]asc[i] \ge asc[mid] > desc[mid] \ge desc[i]; descartamos la mitad derecha y buscamos en la izquierda (leftleft, mid−1mid - 1). - Caso base de parada: si left>rightleft > right, el intervalo se ha vaciado sin coincidencia, retornamos false.

a. Implementación en Java de la función recursiva crossed(int[] asc, int[] desc, int left, int right)

Solución: ```java if (left > right) { return false; } int mid = (left + right) / 2; if (asc[mid] == desc[mid]) { return true; } else if (asc[mid] < desc[mid]) { return crossed(asc, desc, mid + 1, right); } else { return crossed(asc, desc, left, mid - 1); } ```

b. Definir la invocación inicial desde crossed(int[] asc, int[] desc) para abarcar ambos vectores al completo.

Solución: ```java return crossed(asc, desc, 0, asc.length - 1); ```

La explicación paso a paso, hecha con IA, es Premium. Premium

Resuélvelo aquí mismo: corrección automática, pistas y solución paso a paso.

‹ Problema 2 · 2010 · Ejercicio Recuperación - Problema 1. Distancia de Manhattan… · 2010 ›

Más ejercicios de Recursión: diseño, traza y diagramas de llamadas