Está en la página 1de 1

1+a O( n lgn) O( n )

a > 0

Luego, O( n lgn) O( n1.26 ) O(n n )

59. Escribe un algoritmo que dados un vector de n enteros y un entero X, determine si existen en el vector dos nmeros cuya suma sea X. El tiempo de tu algoritmo debe ser de O(n*lgn). Analiza tu algoritmo y demuestra que es as. : Se propone el siguiente algoritmo:
function buscarYZ (Val: in Tabla(1..N); X: in Integer) return Integer is Y,Z: Integer; Hallado:boolean; Valor: Tabla(1..N); begin MergeSort(Val, Valor); for Ind in 1..N-1 loop Y:=Valor(Ind); Z:=X-Y; BUSQUEDA_DICOTOMICA(Valor(Ind+1..N, Z, Pos); if ValorFirst<=Pos and Pos <=ValorLast then return Pos; --naturalmente la pareja es (Ind, Pos) end if; end loop; return 0; -- suponiendo que 0 no sea ndice vlido de Val, o bien -- podra devolverse ValFirst-1 end;

Anlisis del orden del algoritmo: 1. La ordenacin de n enteros mediante el MergeSort es (n lgn) 2. Se repetir a lo sumo n veces un bucle cuyo coste temporal es: Dos asignaciones + sentencia if requieren O(1) La bsqueda dicotmica es logartmica en el nmero de elementos: O(lg i) (y concretamente i(in O(lg i) O(lg n) ) Luego, el bucle es O(n lgn) As pues, y aplicando la regla de la suma, la solucin propuesta tiene orden: (n lgn)

68

También podría gustarte