Advertisement
elcocodrilotito

6.5.7

Mar 22nd, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.95 KB | None | 0 0
  1. #Daniel Bedialauneta
  2. # h: lista de números, h[0] no se usa ==> n=len(h)-1
  3.  
  4. def heapify(h):
  5.     for k in range(2,len(h)): #n-1 repeticiones
  6.         j=k
  7.         i=k//2
  8.         item=h[k]
  9.         #1
  10.         while i>0 and h[i]<item: #s iteraciones
  11.             h[j]=h[i]
  12.             j=i
  13.             i=i//2
  14.             #1
  15.         h[j]=item #1
  16.  
  17. """
  18. i=subíndice
  19. j=subíndice
  20. i,j no tienen nada que ver con los i,j de la función
  21. n-1=número de repeticiones del for
  22. Si=número de repeticiones del while para cada posición k (para cada subíndice i)
  23.  
  24. t(n)=(Suma:i=1 -> n-1)[1+(Suma: j=1 -> Si)(1)+1]=
  25.  
  26. = (Suma:i=1 -> n-1)[(Suma: j=1 -> Si)(1)+2]
  27.  
  28. Esto es, en cada i se suma un Si+2. Si depende de i.
  29.  
  30.  
  31. Mejor caso: que la lista h venga ya ordenada de mayor a menor (sin contar la posición 0)
  32. En tal caso, el contenido del while nunca se va a ejecutar, solo sus condiciones.
  33. Por tanto, podriamos escribir
  34. t(n) = (Suma:i=1 -> n-1)[3] = 3*(n-1) = 3n-1
  35. Es decir, en el mejor caso, t(n) está en O(n)
  36.  
  37.  
  38. Peor caso: no estoy seguro, pero creo que el peor caso es que la lista te venga de menor a mayor y con todos los elementos diferentes (sin tenener en cuenta la posición 0)
  39. En este caso, nos da igual la condición h[i]<item, porque siempre se va a cumplir.
  40. Así que
  41. t(n)=(Suma:i=1 -> n-1)[(Suma: j=1 -> Si)(1)+2] nos queda, porque (Suma: j=1 -> Si)(1)=Si=i//2
  42.  
  43. t(n)=(Suma:i=1 -> n-1)(i//2+2)
  44.  
  45. Para dos i's consecutivos el primero par y el segundo impar, i//2+2 es lo mismo. Ejemplo:
  46. i=4, (4//2)+2=2+2=4
  47. i=5, (5//2)+2=2+2=4
  48. O sea que en vez de hacer la suma de i=1 a n-1, la hacemos hasta la mitad, y cada elemento que sumamos lo multiplicamos por 2. Nos queda:
  49. t(n) = (Suma:i=1 -> n-1)(i//2+2) = (1//2)+2+(Suma:i=2 -> n-1)(i//2+2) (por ser el primer i impar)
  50. 1//2=0
  51. t(n) = (1//2)+2+(Suma:i=2 -> n-1)(i//2+2) = 0+2+(Suma:i=1 -> (n-1)//2)(2*i+4)+delta(n-1 par)*((n-1)//2+2) = ... no sé qué da, pero algo así
  52.  
  53. t(n)= p*n^2+..., es decir, t(n) está en O(n^2)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement