SlideShare una empresa de Scribd logo
1 de 11
1
Ordenamiento y estadísticas de
orden
Agustín J. González
ELO 320: Estructura de Datos y
Algoritmos
2
Ordenamiento y Estadísticas de Orden
Problema de ordenamiento:
Entrada: Una secuencia de n números (a1,a2, ..., an)
Salida: Una permutación (a1´, a2´, a3´,...,an´) de la
entrada tal que a1´ a2´  a3´ ...  an´
Soluciones: Insertion-Sort, merge-sort, heapsort,
quicksort. ---> (n lg n)
La estadística de orden i-ésimo de un conjunto de n
números, es el i-ésimo número más pequeño.
---> O(n)
3
Heapsort
• La estructura de datos “heap” es un arreglo de objetos que
pueden ser vistos como un árbol binario completo.
• Ej.
1
6
1
4
1
0
7 9 3
8
1
4
2
16 |14 |10 | 8 | 7 | 9 | 3 | 2 | 4 | 1
4
Propiedades del heap
• El arreglo puede contener más entradas (=length(A)) que el heap
(=heap_size(A))
• Obviamente heap_size(A)  length(A)
• La raíz del árbol es A[1 (Con índices partiendo de 1)
• Dado un índice i de un nodo, su padre, hijo izquierdo e hijo derecho
son determinados como:
Parent(i)
return  i/2 
Left(i)
return 2i
Right(i)
return 2i+1
Estos procedimientos se pueden implementar como macros o código
“in-line”.
Propiedad heap : A [Parent(i) A [i para todo nodo diferente de la
raíz.
5
Procedimientos básicos usados en algoritmos de
ordenamiento y en colas de prioridad
• Heapify(A,i): Entrada: Left(i) y Right(i) son heaps, pero A[i puede ser menor
que sus hijos.
• Salida: Heapify mueve A[i hacia abajo para que al sub-árbol con raíz i sea un
heap.
Heapify(A,i)
le= Feft(i)
ri= Right(i)
if( le <= heap_size(A) && A[le > A[i )
largest = le
else
largest = i
if ( ri <= heap_size(A) && A[ri > A[largest )
largest = ri
if (largest != i)
exchange A[i <-> A[largest
Heapify(A, largest)
6
Análisis de tiempo de Ejecución
• T(n) = (1) + Tiempo de Heapify sobre uno de los sub-
árboles.
• El peor caso para el tamaño del sub-árbol es 2n/3. Éste
ocurre cuando la última fila está la mitad llena.
2n/3
n/3
T(n)  T(2n/3) + (1)
==> T(n) = O(lg n)
7
Construyendo el heap: Build_Heap
• La construcción del heap se logra aplicando la función heapify de manera
de cubrir el arreglo desde abajo hacia arriba.
• Notar que los nodos hojas, ya son heap. Éstos están en A[ (n/2+1) .. n.
• El procedimiento Build_Heap va a través de los nodos restantes y corre
heapify en cada uno.
Build_Heap(A) {
heap_size [A = length [A
for i = length(A) /2  downto 1
do Heapify(A,i)
}
4 | 1 | 3 | 2 | 16 | 9 | 10 | 14 | 8 | 7
Ejemplo:
8
Análisis del tiempo de ejecución
• Cada llamado a Heapify tiene un costo O(lgn) y como a lo más hay n
de estos llamados, una cota superior para el costo de Build_heap es
O(nlgn).
• Un mejor análisis conduce a O(n)
• ¿Cuántos nodos hay de altura h?
• Para nodos de altura h el costo de Heapify es O(h).
• Luego el costo es    
















 


n
h
h
n
h
h
h
n
O
O(h)
n lg
0
lg
0
1
2
2
2
)
2
/
1
1
(
2
/
1
2 2
0






h
h
h
)
(
2
2
n
O
:
por
acotado
ser
puede
Build_Heap
0
lgn
0
h
n
O
h
n
O
h
h
h
h






















n/2h+1
9
Algoritmo Heapsort
• 1.- Construir un heap invocando a Build_Heap
• 2.- Intercambiar el primer elemento, la raíz y mayor elemento, del heap
con el último.
• 3.- Restituir la propiedad heap en el heap de n-1 elementos.
Heapsort(A)
Build_Heap(A)
for (i= lenght(A) downto 2 ) do
exchange A[1 <-> A[i
heap_size [A = heap_size [A
Heapify(A,1)
• El costo de Heapsort es O(n lg n) porque el llamado a Build_Heap toma O(n)
y luego tenemos n-1 llamados a Heapify cuyo tiempo es O(lgn).
10
Colas de Prioridad
• Heapsort es muy bueno, pero es superado por quicksort (lo veremos
luego).
• La aplicación más popular de heapsort es para implementar colas de
prioridad.
• Una cola de prioridad es una estructura de datos que mantiene un
conjunto de S de elementos cada uno asociado con una clave key.
• La cola de prioridad soporta las siguientes operaciones:
Insert(S,x): inserta x en el conjunto S
Maximum(S): retorna el elemento con mayor clave.
Extract-Max(S): remueve y retorna el elemento con mayor clave.
• Aplicaciones:
-Itineración de tareas en sistemas de tiempo compartido
-Colas de prioridad en simuladores conducidos por evento (Event-
driven simulator)
11
Operaciones en Colas de prioridad
• Heap_Maximum(S): retorna el nodo raíz en tiempo (1).
• Heap_Extract_Max(A)
if heap_size[A] <1 then error “Heap undeflow”
max = A[1]
A[1] = A[heap_size [A]]
heap_size [A] = heap_size [A]]-1
Heapify(A,1)
return max
• Heap_Insert(A,key)
heap_size [A] = heap_size [A]+1
i = heap_size [A]
while (i > 1 and A[Parent(i)] < key) do
A[i] = A[Parent(i)]
i = Parent(i)
A[i] = key
Tiempo de Heap_Extract_Max : O(lg n) básicamente el tiempo de Heapify
Tiempo de Heap_Insert : O(lg n) porque es el recorrido desde la nueva hoja a la raíz.

Más contenido relacionado

Similar a Ordenamiento, estadísticas de orden y heapsort

Procesamiento de datos a gran escala con Apache Spark
Procesamiento de datos a gran escala con Apache SparkProcesamiento de datos a gran escala con Apache Spark
Procesamiento de datos a gran escala con Apache SparkSoftware Guru
 
Aedii pilas colas_y_recursividad_teoria_sem07_a_sem10
Aedii pilas colas_y_recursividad_teoria_sem07_a_sem10Aedii pilas colas_y_recursividad_teoria_sem07_a_sem10
Aedii pilas colas_y_recursividad_teoria_sem07_a_sem10chrisflores001
 
Una visión de las técnicas y métodos de análisis en entornos Big Data utiliza...
Una visión de las técnicas y métodos de análisis en entornos Big Data utiliza...Una visión de las técnicas y métodos de análisis en entornos Big Data utiliza...
Una visión de las técnicas y métodos de análisis en entornos Big Data utiliza...Victoria López
 
Fundamentos de Analisi y Diseño de Algoritmos FADA
Fundamentos de Analisi y Diseño de Algoritmos FADAFundamentos de Analisi y Diseño de Algoritmos FADA
Fundamentos de Analisi y Diseño de Algoritmos FADAJose Luis Dorao
 
Tiempo de ejecucion de particiones (quicksort)
Tiempo de ejecucion de particiones (quicksort)Tiempo de ejecucion de particiones (quicksort)
Tiempo de ejecucion de particiones (quicksort)Linio Colquehuanca Rodrigo
 
LinearSortOrderSatatistics.ppt
LinearSortOrderSatatistics.pptLinearSortOrderSatatistics.ppt
LinearSortOrderSatatistics.pptjlmansilla
 

Similar a Ordenamiento, estadísticas de orden y heapsort (18)

Apache spark meetup
Apache spark meetupApache spark meetup
Apache spark meetup
 
Procesamiento de datos a gran escala con Apache Spark
Procesamiento de datos a gran escala con Apache SparkProcesamiento de datos a gran escala con Apache Spark
Procesamiento de datos a gran escala con Apache Spark
 
Algoritmo por seleccion
Algoritmo por seleccionAlgoritmo por seleccion
Algoritmo por seleccion
 
Python Pilas y Colas
Python Pilas y ColasPython Pilas y Colas
Python Pilas y Colas
 
Aedii pilas colas_y_recursividad_teoria_sem07_a_sem10
Aedii pilas colas_y_recursividad_teoria_sem07_a_sem10Aedii pilas colas_y_recursividad_teoria_sem07_a_sem10
Aedii pilas colas_y_recursividad_teoria_sem07_a_sem10
 
08 pilas1 t2018
08 pilas1 t201808 pilas1 t2018
08 pilas1 t2018
 
05 - Analisis de Algoritmos.pptx
05 - Analisis de Algoritmos.pptx05 - Analisis de Algoritmos.pptx
05 - Analisis de Algoritmos.pptx
 
Practica 3
Practica  3Practica  3
Practica 3
 
Analisis Algoritmo
Analisis AlgoritmoAnalisis Algoritmo
Analisis Algoritmo
 
parcial
parcialparcial
parcial
 
Una visión de las técnicas y métodos de análisis en entornos Big Data utiliza...
Una visión de las técnicas y métodos de análisis en entornos Big Data utiliza...Una visión de las técnicas y métodos de análisis en entornos Big Data utiliza...
Una visión de las técnicas y métodos de análisis en entornos Big Data utiliza...
 
Fundamentos de Analisi y Diseño de Algoritmos FADA
Fundamentos de Analisi y Diseño de Algoritmos FADAFundamentos de Analisi y Diseño de Algoritmos FADA
Fundamentos de Analisi y Diseño de Algoritmos FADA
 
Pqueues
PqueuesPqueues
Pqueues
 
Pqueues
PqueuesPqueues
Pqueues
 
Tiempo de ejecucion de particiones (quicksort)
Tiempo de ejecucion de particiones (quicksort)Tiempo de ejecucion de particiones (quicksort)
Tiempo de ejecucion de particiones (quicksort)
 
Mètodos de Ordenaciòn y bùsqueda
Mètodos de Ordenaciòn y bùsquedaMètodos de Ordenaciòn y bùsqueda
Mètodos de Ordenaciòn y bùsqueda
 
Informe
InformeInforme
Informe
 
LinearSortOrderSatatistics.ppt
LinearSortOrderSatatistics.pptLinearSortOrderSatatistics.ppt
LinearSortOrderSatatistics.ppt
 

Más de jlmansilla

maximumFlow.ppt
maximumFlow.pptmaximumFlow.ppt
maximumFlow.pptjlmansilla
 
elementaryAlgorithms.ppt
elementaryAlgorithms.pptelementaryAlgorithms.ppt
elementaryAlgorithms.pptjlmansilla
 
binarySearchTree.ppt
binarySearchTree.pptbinarySearchTree.ppt
binarySearchTree.pptjlmansilla
 
NP_Completitud.ppt
NP_Completitud.pptNP_Completitud.ppt
NP_Completitud.pptjlmansilla
 
PERDIDA_EN_UNA_RED_DE_FIBRA_OPTICA.pptx
PERDIDA_EN_UNA_RED_DE_FIBRA_OPTICA.pptxPERDIDA_EN_UNA_RED_DE_FIBRA_OPTICA.pptx
PERDIDA_EN_UNA_RED_DE_FIBRA_OPTICA.pptxjlmansilla
 

Más de jlmansilla (9)

NTFSFS.ppt
NTFSFS.pptNTFSFS.ppt
NTFSFS.ppt
 
maximumFlow.ppt
maximumFlow.pptmaximumFlow.ppt
maximumFlow.ppt
 
NTFS.ppt
NTFS.pptNTFS.ppt
NTFS.ppt
 
elementaryAlgorithms.ppt
elementaryAlgorithms.pptelementaryAlgorithms.ppt
elementaryAlgorithms.ppt
 
binarySearchTree.ppt
binarySearchTree.pptbinarySearchTree.ppt
binarySearchTree.ppt
 
greedy.ppt
greedy.pptgreedy.ppt
greedy.ppt
 
NP_Completitud.ppt
NP_Completitud.pptNP_Completitud.ppt
NP_Completitud.ppt
 
BasicC++.ppt
BasicC++.pptBasicC++.ppt
BasicC++.ppt
 
PERDIDA_EN_UNA_RED_DE_FIBRA_OPTICA.pptx
PERDIDA_EN_UNA_RED_DE_FIBRA_OPTICA.pptxPERDIDA_EN_UNA_RED_DE_FIBRA_OPTICA.pptx
PERDIDA_EN_UNA_RED_DE_FIBRA_OPTICA.pptx
 

Ordenamiento, estadísticas de orden y heapsort

  • 1. 1 Ordenamiento y estadísticas de orden Agustín J. González ELO 320: Estructura de Datos y Algoritmos
  • 2. 2 Ordenamiento y Estadísticas de Orden Problema de ordenamiento: Entrada: Una secuencia de n números (a1,a2, ..., an) Salida: Una permutación (a1´, a2´, a3´,...,an´) de la entrada tal que a1´ a2´  a3´ ...  an´ Soluciones: Insertion-Sort, merge-sort, heapsort, quicksort. ---> (n lg n) La estadística de orden i-ésimo de un conjunto de n números, es el i-ésimo número más pequeño. ---> O(n)
  • 3. 3 Heapsort • La estructura de datos “heap” es un arreglo de objetos que pueden ser vistos como un árbol binario completo. • Ej. 1 6 1 4 1 0 7 9 3 8 1 4 2 16 |14 |10 | 8 | 7 | 9 | 3 | 2 | 4 | 1
  • 4. 4 Propiedades del heap • El arreglo puede contener más entradas (=length(A)) que el heap (=heap_size(A)) • Obviamente heap_size(A)  length(A) • La raíz del árbol es A[1 (Con índices partiendo de 1) • Dado un índice i de un nodo, su padre, hijo izquierdo e hijo derecho son determinados como: Parent(i) return  i/2  Left(i) return 2i Right(i) return 2i+1 Estos procedimientos se pueden implementar como macros o código “in-line”. Propiedad heap : A [Parent(i) A [i para todo nodo diferente de la raíz.
  • 5. 5 Procedimientos básicos usados en algoritmos de ordenamiento y en colas de prioridad • Heapify(A,i): Entrada: Left(i) y Right(i) son heaps, pero A[i puede ser menor que sus hijos. • Salida: Heapify mueve A[i hacia abajo para que al sub-árbol con raíz i sea un heap. Heapify(A,i) le= Feft(i) ri= Right(i) if( le <= heap_size(A) && A[le > A[i ) largest = le else largest = i if ( ri <= heap_size(A) && A[ri > A[largest ) largest = ri if (largest != i) exchange A[i <-> A[largest Heapify(A, largest)
  • 6. 6 Análisis de tiempo de Ejecución • T(n) = (1) + Tiempo de Heapify sobre uno de los sub- árboles. • El peor caso para el tamaño del sub-árbol es 2n/3. Éste ocurre cuando la última fila está la mitad llena. 2n/3 n/3 T(n)  T(2n/3) + (1) ==> T(n) = O(lg n)
  • 7. 7 Construyendo el heap: Build_Heap • La construcción del heap se logra aplicando la función heapify de manera de cubrir el arreglo desde abajo hacia arriba. • Notar que los nodos hojas, ya son heap. Éstos están en A[ (n/2+1) .. n. • El procedimiento Build_Heap va a través de los nodos restantes y corre heapify en cada uno. Build_Heap(A) { heap_size [A = length [A for i = length(A) /2  downto 1 do Heapify(A,i) } 4 | 1 | 3 | 2 | 16 | 9 | 10 | 14 | 8 | 7 Ejemplo:
  • 8. 8 Análisis del tiempo de ejecución • Cada llamado a Heapify tiene un costo O(lgn) y como a lo más hay n de estos llamados, una cota superior para el costo de Build_heap es O(nlgn). • Un mejor análisis conduce a O(n) • ¿Cuántos nodos hay de altura h? • Para nodos de altura h el costo de Heapify es O(h). • Luego el costo es                         n h h n h h h n O O(h) n lg 0 lg 0 1 2 2 2 ) 2 / 1 1 ( 2 / 1 2 2 0       h h h ) ( 2 2 n O : por acotado ser puede Build_Heap 0 lgn 0 h n O h n O h h h h                       n/2h+1
  • 9. 9 Algoritmo Heapsort • 1.- Construir un heap invocando a Build_Heap • 2.- Intercambiar el primer elemento, la raíz y mayor elemento, del heap con el último. • 3.- Restituir la propiedad heap en el heap de n-1 elementos. Heapsort(A) Build_Heap(A) for (i= lenght(A) downto 2 ) do exchange A[1 <-> A[i heap_size [A = heap_size [A Heapify(A,1) • El costo de Heapsort es O(n lg n) porque el llamado a Build_Heap toma O(n) y luego tenemos n-1 llamados a Heapify cuyo tiempo es O(lgn).
  • 10. 10 Colas de Prioridad • Heapsort es muy bueno, pero es superado por quicksort (lo veremos luego). • La aplicación más popular de heapsort es para implementar colas de prioridad. • Una cola de prioridad es una estructura de datos que mantiene un conjunto de S de elementos cada uno asociado con una clave key. • La cola de prioridad soporta las siguientes operaciones: Insert(S,x): inserta x en el conjunto S Maximum(S): retorna el elemento con mayor clave. Extract-Max(S): remueve y retorna el elemento con mayor clave. • Aplicaciones: -Itineración de tareas en sistemas de tiempo compartido -Colas de prioridad en simuladores conducidos por evento (Event- driven simulator)
  • 11. 11 Operaciones en Colas de prioridad • Heap_Maximum(S): retorna el nodo raíz en tiempo (1). • Heap_Extract_Max(A) if heap_size[A] <1 then error “Heap undeflow” max = A[1] A[1] = A[heap_size [A]] heap_size [A] = heap_size [A]]-1 Heapify(A,1) return max • Heap_Insert(A,key) heap_size [A] = heap_size [A]+1 i = heap_size [A] while (i > 1 and A[Parent(i)] < key) do A[i] = A[Parent(i)] i = Parent(i) A[i] = key Tiempo de Heap_Extract_Max : O(lg n) básicamente el tiempo de Heapify Tiempo de Heap_Insert : O(lg n) porque es el recorrido desde la nueva hoja a la raíz.