María Fernanda Mora Alba
Luis Manuel Román García
26 de agosto del 2015
The main subject of my talk is perhaps most directly indicated by simply asking two questions: first, is it harder to multiply than to add? And second, why?
-Alan Cobham, 1964
Everyone who could appreciate a symphony would be Mozart; everyone who could follow a step-by-step argument would be Gauss; everyone who could recognize a good investment strategy would be Warren Buffett.
- Aaronson, MIT
Búsqueda
Entrada: lista de números
Salida: Lista , que es el ordenamiento de
Verificación
Entrada: listas de números
y
Salida: "Sí" si es la versión ordenada de . "NO" si no.
Entrada: lista de números
Salida: Sublistas y de en donde la suma de es igual a la suma de . Adicionalmente una lista del mismo tamaño de que indica en qué sublista quedó cada elemento
Entrada: listas de números y
Salida: "Sí" si las sublistas correspondientes a suman mismo. "No" si no.
Búsqueda
Verificación
Entrada: gráfica con nodos y aristas y un conjunto de colores
Salida: Lista del mismo tamaño de tal que ningún nodo adyacente tenga el mismo color
Entrada: gráfica con nodos y aristas y una lista que asigna colores a los nodos
Salida: "Sí" si todos los nodos adyacentes tienen colores diferentes. "No" si no.
Búsqueda
Verificación
Un problema está en si su Versión de Búsqueda tiene una solución rápida (i.e., se resuelve en tiempo polimonial, i.e. existe un algoritmo que lo resuelve en tiempo para alguna )
Ejemplos:
Un problema está en si su Versión de Verificación tiene una solución rápida (i.e., se verifica en tiempo polimonial, i.e. existe un algoritmo que lo resuelve en tiempo para alguna )
Ejemplos:
- Álgebra Lineal: Multiplicación de matrices, Cálculo de determinante de una matriz, Factorización LU de matrices
- Teoría de números: Máximo común divisor
- Teoría de Gráficas: Ruta más corta, conectividad
Si la versión de Búsqueda de un problema tiene una solución rápida, entonces su versión de Verificación también, pues si podemos resolver la forma general del problema, podemos resolver casos particulares del mismo
Equivale a preguntarnos si:
¿Existen problemas cuya versión de verificación se puede resolver fácilmente (aká eficientemente, en tiempo polinomial) pero cuya versión de búsqueda no?
def inser_sort(array):
N = array.size
for i in range(1, N):
aux = array[i]
k = i - 1
while (k >= 0) == True & (aux < array[k]) == True:
array[k + 1] = array[k]
k = k - 1
array[k + 1] = aux
return array
def sort(L,R):
NL = L.size
NR = R.size
answer = np.empty(0)
i = 0
j = 0
k = 0
while (i < NL) == True & (j < NR) == True:
if L[i] <= R[j]:
answer = np.hstack([answer, L[i]])
k = k + 1
i = i + 1
else:
answer = np.hstack([answer, R[j]])
k = k + 1
j = j + 1
if i < NL:
answer = np.hstack([answer, L[i::]])
elif j < NR:
answer = np.hstack([answer, R[j::]])
return answer
def mix(array):
N = array.size
if N == 1:
return array
return sort(mix(array[0:N/2]), mix(array[N/2:N])
Aquí pueden probar nuestro código.
El peor caso corre en un tiempo de n el número de elementos a ordenar.
El peor caso corre en un tiempo de n el número de elementos a ordenar.
Buscamos n tal que
donde
siempre que
-0.096704034
0.103657816
14.324727836
1.039392
15.425424
En esta sección se compara el desempeño de los algoritmos de ordenamiento de inserción directa y mezcla para grandes valores de n.
9.9338 seg.
1315.5625 seg.
198485.84985 seg.
55.13 hr.
21.92 min.
46.15705 seg.
4624.5704 seg.
77.07 min.