140 likes | 282 Views
Diseño y análisis de algoritmos. Temario. Clasificación Arreglos Ej:inserción Ej:Selección Ej:Intercambio Ej:Partición :QuikSort. Clasificación. Arreglos Estructura base. TYPE index = INTEGER ; VAR d :ARRAY[1..N] of item. Estos métodos se conocen como directos
E N D
Temario • Clasificación • Arreglos • Ej:inserción • Ej:Selección • Ej:Intercambio • Ej:Partición :QuikSort
Clasificación Arreglos Estructura base TYPE index = INTEGER ; VAR d:ARRAY[1..N] of item • Estos métodos se conocen como directos • Se verán rápidamente porque: • Permitien dilucidar los princípos de los problemas de clasificación • Algoritmos cortos y fáciles de entender • Lós algoritmos más eficientes son más complejos y deben usarse sólo para n • Grándes
Clasificación Arreglos Alg1.1: Inserción directa • Pseudocódigo • Para i:=2 a n • { • X:=d[i]: • Insertar x en el sitio que corresponde en d1...di • } • Cond. Término: • Se en encuentra un elemento aj que tiene una llave menor que la x • El extremo izquierdo de la secuencia de destino se ha alcanzado • Se agrega en cada ciclo un centinela por lo tanto el arreglo aumenta [0..n] Procedure insersión directa; Var i,j:index;x:item; BEGIN For i:=2 TO n DO BEGIN x:=d[i];d[0]:=x;j:=i; WHILE (x<d[j-1]) DO d[j]:=d[j-1];j:=j-1 END; d[j]:=x END END Análisis: Mejor Caso pert O(n) Resto pert O(n ) Es dependiente del orden Inicial de los datos?? 2
Clasificación Arreglos Alg1.1: Inserción directa • Ejemplo: • Datos iniciales: 44 55 12 42 94 18 06 67 • i=2 44 55 12 42 94 18 06 67 • i=3 12 44 55 42 94 18 06 67 • i=4 12 42 44 55 94 18 06 67 • i=5 12 42 44 55 94 18 06 67 • i=6 12 18 42 44 55 94 06 67 • i=7 06 12 18 42 44 55 94 67 • i=8 06 12 18 42 44 55 67 94 • El algoritmo es sensible al orden inicial, y el número de copmaraciones depende de los valores • Si los elementos están ordenados no entrará nunca al mientras, por lo tanto hará un • Recorrido lo que da un O(n). • El peor caso se da cuando los elementos están en orden inverso al deseado • Notar que de 1 hasta i se mantiene siempre un orden (relativo). Esto sugiere buscar más • rápidmente el punto de inserción que un retroceso secuencial. La idea es agregar una búsquda • binaria que prueba la secuencia destino en la mitad, luego reduce la busqueda a la mitad • hasta encontrar el punto de inserción. El algoritmo de inserción modificado se llama inserción • binaria
Clasificación Arreglos Alg2.1: Inserción directa, Insersión binaria Procedure InsBin; VAR i,j,m,L,R:index;x:item; BEGIN FOR i:=2 TO n DO BEGIN X:=d[i];L:=1;R:=i; WHILE L<R DO m:= (L+R)DIV2; IF d[m] <= x THEN L:= m+1 ELSE R:=m END; FOR j:=i DOWNTO R+1 DO d[j]:=d[j-1]; d[R]:=x END END;
Clasificación Arreglos Alg1.2: Inserción directa, Insersión binaria • El algoritmo es sensible al orden inicial, • La posición de inserción se encuentra si L=R, por lo que el intervalo final de búsqueda debe • ser de largo 1, por lo que cada vez se divide el intervalo de búusqueda en la mitad. • Por lo tanto se supone dividir a la mitad el intervalo de longitud i vecespor tanto: • Esta suma se puede aproximar por la integral • Por lo tanto el número de comparaciones pruducto de la búsqueda binaria es del orden • , sin embargo aún queda el segundo for que en conjunto con el primero mantien el • Algoritmo en un orden El prblema de fondo de este método de ordenamiento es que • cada vez que debe reorenar desplaza un segmento completo de los datos. Veremos otras • Alternativas, como el ordenamiento por selección directa.
Clasificación Arreglos Alg2: Selección directa • Diseño • Seleccionar el elemento que tenga la llave menor. • Intercambiarlo con el primer elemento d[1]. • Repetir 1 y 2 con (n-1) elementos restantes, (n-2) elementos restantes • FIN queda un solo elemento --- El más grande • Pseudocódigo • Para i:=1 a n -1 • {Asignar el índice del elemento más pequeño entred1...dia k • Intercambiar di con dk } Procedure selecdirecta; Var i,j,k:index;x:item; BEGIN FOR i:=1 TO n-1 DO BEGIN k:=i; x=d[i]; FOR j:=i+1 TO n DO IF (d[j] <x) THEN k:=1; x :=d[j]; END; d[k]:=d[i]; d[i]:=x END END Arreglo inicial: 44 55 12 42 94 18 06 67 06 55 12 42 94 18 44 67 06 12 55 42 94 18 44 67 06 12 18 42 94 55 44 67 06 12 18 42 94 55 44 67 06 12 18 42 44 55 94 67 06 12 18 42 44 55 94 67 06 12 18 42 44 55 67 94
Clasificación Arreglos Alg 2: Selección directa • El algoritmo es sensible al orden inicial, el número de comparaciones es independiente de • los datos, al contrario que la inserción directa. Hay un segundo for fijo. Si es el número de • comparaciones necesarias, se puede pensar que, dado que el segundo for se va haciendo cada • vez más pequeño en una unidad: • El patrón se puede reconocer dándose valores: Por otro lado en el mejor habrá que ahcer alrdedor de n asignaciones y las comparaciones se por lo que el algoritmo será del así como en el peor caso. Preferible alanterior
Clasificación Arreglos Alg3: intercambio directo • Diseño • Todos los métodos tienen de alguna manera operaciones de intercambio. • Este algoritmo es el famoso ordenamiento de burbuja Procedure burbuja; Var i,j:index;x:item; BEGIN FOR i:=2 TO n DO FOR j:=n DOWNTO i DO IF (d[j-1] > d[j]) THEN x:=d[j-1]; d[j-1]:=d[j]; d[j]:=x END END Arreglo inicial: 44 55 12 42 94 18 06 67 06 44 55 12 42 94 18 67 06 12 44 55 18 42 94 67 06 12 18 44 55 42 67 94 06 12 18 42 44 55 67 94 06 12 18 42 44 55 67 94 06 12 18 42 44 55 67 94 06 12 18 42 44 55 67 94 El núero de comaraciones necesarias se calcula con la misma lógica que el Algoritmo anterior por lo que el orden es A pesar de que no se Puede mejorar su orden, deteniendo el algoritmo si el orden seha comletado.
Clasificación Arreglos Alg 4: Partición:Quiksort • El es l más rápido para clasificar. Se basa en intercambiar y particionar. Una primera • Aproximación: • Seleccionar un elemento al azar del arreglo x • Se recorre el arreglo a partir de la izquierda hasta encontrar un elemento i > x • Se recorre el arreglo desde la derecha hasta encontrar un elemento j < x • A continuación se intercambian ambos elementos y se vuelve a 2 hasta que i y j se • Encuentren en algún punto cerca del centro del arreglo. El resultado es que se ha dividido • el arreglo la parte a la izquierda del elemento x con elementos menores o iguales a x y la • derecha con elementos mayores o iguales. Procedure particion; Var i,j:index;w,x:item; BEGIN i:=1;j:=n; (*seleccionar un elemento de d al azar y asignar a x*) REPEAT WHILE d[i] < x DO i:=i+1; WHILE d[j] > x DO j:=j-1; IF i <=j THEN BEGIN w:=a[i];a[i]:=a[j];a[j]:=w;i:=i+1;j:=j-1 END UNTIL i>j; END Arreglo inicial:x=42 44 55 12 42 94 06 18 67 18 55 12 42 94 06 44 67 18 06 12 42 94 55 44 67
Clasificación Arreglos Alg 4: Partición:Quiksort • Se debe recordar que lo que lo que se quiere es ordenar. Sin embargo Una vez que se tiene un • algoritmo eficiente de partición, se tiene dividido el arrgelo, por lo que el sigueinte paso • es aplicar el mismo procedimiento a la partición izquierda, luego a la derecha y así • sucesivamente hasta que cada partición conste de un solo elemento. Claramente esta es una • definición recursiva • Criterio de parada, establecido cuando las particiones son de un elemento. • Convergencia, asegurada porque las particiones siempre son cada vez más pequeñas. Procedure qsort(L,R:index); Var i,j:index;w,x:item; BEGIN i:=L;j:=R; x:= d[(L+R) DIV 2)] REPEAT WHILE d[i] < x DO i:=i+1; WHILE d[j] > x DO j:=j-1; IF i <=j THEN BEGIN w:=a[i];a[i]:=a[j];a[j]:=w;i:=i+1;j:=j-1 END UNTIL i>j; IF L< j THEN qsort(L,j); IF R> i THEN qsort(i,R); qsort(1,n); Arreglo inicial:x=42 44 55 12 42 94 06 18 67 18 55 12 42 94 06 44 67 18 06 12 42 94 55 44 67 qsort(1,3) x=6 18 06 12 06 18 12 06 fin Qsort(2,3) 18 12 12 18 fin Qsort(5,8)....
Clasificación Arreglos Alg3: QuikSORT • Análisis: • Cómo es el comportamiento del proceso de partición?? • Tras haber seleccionado un límite x, recorre todo el arreglo. • De ahí se efectúan exactamente n comparaciones • El número de intercambios puede determinarse con el sguiente método probabilístico: • Con un límite fijo x, el número previsto de operaciones de intercambio es igual al de elementos • en la parte izquierda de la partición, o sea n – 1 * Prob( elemento haya alcanzado su su lugar mediante un INTERCAMBIO). • Habrá tenido lugar un intercambio si el elemento ha sido antes parte de la partición DERECHA; • P(de este evento)=(n-(x-1))/n. • El número esperado de intercambios es el promedio de esos valores previstos sobre todos los LIMITES posibles x.: • Si se eligiera SIEMPRE la mediana como límite , cada proceso divide el arreglo en 2 mitades y el número de pases necesarios sería de log(n). El número ideal de comparaciones será de f=n*log n • E intercambio, g=n*log(n)/6 . Pero la probabilidad de esto es apenas de 1/n. El rendimientoMedio de QS es inferior al caso óptimo por 2*ln(2). Por otro lado se puede dar un mal caso y comportarse
Clasificación Arreglos Alg3: QuikSORT no recursivo: Procedure qsort; CONST M=100; Var i,j,L,R:index;w,x:item; s: 0..M; stack: ARRAY[1..M] of RECORD L,R:Index END; BEGIN s:=1; satack[1].L=1;stack[1].R=n; REPEAT (*tomar petición encima del stack*) L:= stack[s].L; R:= stack[s]. R;s:=s-1; REPEAT (*Particion*) i:=L;j:=R; x:= d[(L+R) DIV 2)]; REPEAT WHILE d[i] < x DO i:=i+1; WHILE d[j] > x DO j:=j-1; IF i <=j THEN BEGIN w:=a[i];a[i]:=a[j];a[j]:=w;i:=i+1;j:=j-1 END UNTIL i>j; IF R> i THEN (*apilar petición para ordenar paricion derecha* s:=s+1; stack[s].L=i; stack[s].R=R; R:=j; UNTIL L>=R (*ahora Ly R delelimitan particion izquierda*) UNTIL s=0 EBD qsort;