















Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Asignatura: Fundamentos de Programacion, Profesor: Luis Javier Rodriguez Fuentes, Carrera: Física, Universidad: UCM
Tipo: Apuntes
1 / 23
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!
















10 Marzo 201 4
Fundamentos de Programación
ordenación sobre estructuras lineales
fijo (independiente del tamaño del vector o matriz)
soluciones a un problema, se tratará de evaluar cualitativamente el coste temporal de cada solución y analizar la idoneidad de una u otra en función del tamaño del problema
un valor x, deberá devolverse una posición (entre 0 y n-1) donde aparezca x; en caso de no encontrarla, se devolverá None
búsqueda secuencial puede acabar en cuanto detecta que el valor buscado es menor que el actual: def buscar2 (v,x): n=len(v) for i in range(n): if v[i]==x: return i elif v[i]>x: return None return None
del valor de x, el coste temporal de buscar2() puede ser menor (x pequeños) o mayor (x grandes) que el de buscar()
magnitud del coste es idéntico: en el mejor caso se realiza un único paso y en el peor, n pasos
solución más eficiente es la búsqueda dicotómica: def bdicr(v,i,j,x): if i>j: return None m=(i+j)// if x<v[m]: return bdicr(v,i,m-1,x) if x>v[m]: return bdicr(v,m+1,j,x) return m
recursivamente, reduciendo el intervalo de búsqueda a la mitad con cada llamada
bdicr(v, 0, len(v)-1, x)
(x está justo en la mitad del vector)
pasos/llamadas (x no se encuentra en el vector)
eficientes de búsqueda
que se establece una relación de orden; el objetivo es reorganizar los valores en el propio vector, de modo que v[i]<=v[j] para cualquier i<j
sort realiza precisamente esa tarea: v.sort()
implican un número de pasos proporcional a n 2 , y métodos más eficientes ( quicksort , mergesort , etc.) que en un caso promedio implican del orden de n*log 2 (n) pasos
def sort_ins(v): n=len(v) for i in range(1,n): x=v[i] j=i- while j>=0 and x<v[j]: v[j+1]=v[j] j=j- v[j+1]=x
i=0 3 1 7 -1 0 5 i=1 1 3 7 -1 0 5 i=2 1 3 7 -1 0 5 i=3 -1 1 3 7 0 5 i=4 -1 0 1 3 7 5 i=5 -1 0 1 3 5 7
ordenado)
2 pasos (vector en orden inverso)...
def sort_sel(v): n=len(v) for i in range(0,n-1): minimo=v[i] argmin=i for j in range(i+1,n): if v[j]<minimo: minimo=v[j] argmin=j v[argmin]=v[i] v[i]=minimo
i=0 -1 1 7 3 0 5 i=1 -1 0 7 3 1 5 i=2 -1 0 1 3 7 5 i=3 -1 0 1 3 7 5 i=4 -1 0 1 3 5 7
2 pasos (en todos los casos)...
Coste temporal
2
Coste temporal
2
(0,5) pivote = 0 3 1 7 -1 0 5 0 1 7 -1 3 5 0 -1 7 1 3 5 j=1, i= (0,1) pivote = 0 0 -1 7 1 3 5 -1 0 7 1 3 5 j=0, i= (2,5) pivote = 5 -1 0 7 1 3 5 -1 0 5 1 3 7 j=4, i= (2,4) pivote = 3 -1 0 5 1 3 7 -1 0 3 1 5 7 j=3, i= (2,3) pivote = 1 -1 0 3 1 5 7 -1 0 1 3 5 7 j=2, i=3, FIN
‣ n = der - izq + 1^ (tamaño del intervalo a ordenar) ‣ Una parte de los pasos se realizan dentro de la propia llamada: inicialización y ciclo principal ‣ Pero al tratarse de un algoritmo recursivo, hay que contabilizar también los pasos que se realizan dentro de las llamadas recursivas (que pueden ser dos, una o ninguna) ‣ t(n) = 1 + tcp(n) + t(k) + t(n-k)^ (caso general) ‣ t(1) = 1^ (caso base: los tramos de tamaño 1 ya están ordenados) ‣ Se puede demostrar que el número de comparaciones, incrementos/ decrementos e intercambios en el ciclo principal es proporcional a n: tcp(n) = an + b* ∈ Θ(n)
n/8 n/8 n/8 n/8 n/8 n/8 n/8 n/ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 n/ n/4 n/4 n/4 n/ n/ n n n n log n ....... n n Θ(n log n) Esquema del mejor caso
Esquema del peor caso n 1 1 1 n− 1 n− 2 n− 3 2 1 1 ....... n n n− 1 n− 2 2 3 n ∑n i= i + n − 1 = 1 2 n 2
3 2 n − 1 ∈ Θ(n 2 )