Skip to content

Commit a654bea

Browse files
committed
cambios manu
1 parent 51b5759 commit a654bea

File tree

2 files changed

+71
-23
lines changed

2 files changed

+71
-23
lines changed

Notas/12_Ordenamiento/02_Ordenamiento_sencillo.md

Lines changed: 64 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ def ord_seleccion(lista):
3636

3737
# reducir el segmento en 1
3838
n = n - 1
39+
40+
return lista
3941

4042
def buscar_max(lista, a, b):
4143
"""Devuelve la posición del máximo elemento en un segmento de
@@ -67,20 +69,25 @@ DEBUG: 0 4 [0, 2, -1, 2, 3, 5]
6769
DEBUG: 1 3 [0, 2, -1, 2, 3, 5]
6870
DEBUG: 1 2 [0, -1, 2, 2, 3, 5]
6971
DEBUG: 0 1 [-1, 0, 2, 2, 3, 5]
70-
>>> lista
72+
7173
[-1, 0, 2, 2, 3, 5]
74+
7275
>>> lista = []
7376
>>> ord_seleccion(lista)
77+
[]
78+
7479
>>> l = [1]
7580
>>> ord_seleccion(lista)
76-
>>> lista
7781
[1]
82+
7883
>>> lista = [1, 2, 3, 4, 5]
7984
>>> ord_seleccion(lista)
8085
DEBUG: 4 4 [1, 2, 3, 4, 5]
8186
DEBUG: 3 3 [1, 2, 3, 4, 5]
8287
DEBUG: 2 2 [1, 2, 3, 4, 5]
8388
DEBUG: 1 1 [1, 2, 3, 4, 5]
89+
90+
[1, 2, 3, 4, 5]
8491
```
8592

8693

@@ -139,6 +146,8 @@ def ord_insercion(lista):
139146
reubicar(lista, i + 1)
140147
print("DEBUG: ", lista)
141148

149+
return lista
150+
142151
def reubicar(lista, p):
143152
"""Reubica al elemento que está en la posición p de la lista
144153
dentro del segmento [0:p-1].
@@ -179,22 +188,25 @@ DEBUG: [-1, 2, 3, 5, 0, 2]
179188
DEBUG: [-1, 2, 3, 5, 0, 2]
180189
DEBUG: [-1, 0, 2, 3, 5, 2]
181190
DEBUG: [-1, 0, 2, 2, 3, 5]
182-
>>> lista
191+
183192
[-1, 0, 2, 2, 3, 5]
193+
184194
>>> lista = []
185195
>>> ord_insercion(lista)
196+
[]
197+
186198
>>> lista = [1]
187199
>>> ord_insercion(lista)
188-
>>> lista
189200
[1]
201+
190202
>>> lista = [1, 2, 3, 4, 5, 6]
191203
>>> ord_insercion(lista)
192204
DEBUG: [1, 2, 3, 4, 5, 6]
193205
DEBUG: [1, 2, 3, 4, 5, 6]
194206
DEBUG: [1, 2, 3, 4, 5, 6]
195207
DEBUG: [1, 2, 3, 4, 5, 6]
196208
DEBUG: [1, 2, 3, 4, 5, 6]
197-
>>> lista
209+
198210
[1, 2, 3, 4, 5, 6]
199211
```
200212

@@ -275,16 +287,30 @@ El ordenamiento por burbujeo se basa en una idea bastante sencilla. El algoritmo
275287

276288
Como en el primer paso tenemos la garantía de que el mayor elemento quedó al final de la lista, la segunda recorrida puede evitar llegar hasta esa última posición. Así, cada recorrida es más corta que la anterior. En cada recorrida se comparan todos los pares de elementos sucesivos (en el rango correspondiente) y se intercambian si no están ordenados.
277289

278-
Programá una función `ord_burbujeo(lista)` que implemente este método de ordenamiento. ¿Cuántas comparaciones realiza esta función en una lista de largo n?
290+
Programá una función `ord_burbujeo(lista)` que implemente este método de ordenamiento. Debe tomar una lista y devolver la lista ordenada. ¿Cuántas comparaciones realiza esta función en una lista de largo n?
279291

280292
Probá tu código con las siguientes listas.
281293

282294
```python
283-
lista_1 = [1, 2, -3, 8, 1, 5]
284-
lista_2 = [1, 2, 3, 4, 5]
285-
lista_3 = [0, 9, 3, 8, 5, 3, 2, 4]
286-
lista_4 = [10, 8, 6, 2, -2, -5]
287-
lista_5 = [2, 5, 1, 0]
295+
>>> lista_1 = [1, 2, -3, 8, 1, 5]
296+
>>> ord_burbujeo(lista_1)
297+
[-3, 1, 1, 2, 5, 8]
298+
299+
>>> lista_2 = [1, 2, 3, 4, 5]
300+
>>> ord_burbujeo(lista_2)
301+
[1, 2, 3, 4, 5]
302+
303+
>>> lista_3 = [0, 9, 3, 8, 5, 3, 2, 4]
304+
>>> ord_burbujeo(lista_3)
305+
[0, 2, 3, 3, 4, 5, 8, 9]
306+
307+
>>> lista_4 = [10, 8, 6, 2, -2, -5]
308+
>>> ord_burbujeo(lista_4)
309+
[-5, -2, 2, 6, 8, 10]
310+
311+
>>> lista_5 = [2, 5, 1, 0]
312+
>>> ord_burbujeo(lista_5)
313+
[0, 1, 2, 5]
288314
```
289315

290316
Guardá tu solución en el archivo `burbujeo.py` comentando la complejidad del algoritmo y cómo la calculaste.
@@ -295,19 +321,40 @@ _Extra:_ ¿Podés escribir una versión recursiva de este algoritmo?
295321
Elegí dos listas de las 5 del ejercicio anterior y ordenalas a mano (con papel y lápiz) con los 3 métodos: selección, inserción y burbujeo.
296322

297323
### Ejercicio 12.4: experimento con 3 métodos
298-
Hacé una función `generar_lista(N)` que genere una lista aleatoria de largo N con números enteros del 1 al 1000 (puede haber repeticiones).
324+
Creá un programa `comparaciones_ordenamiento.py` para trabajar comparando las distintas formas de ordenar listas.
299325

300-
Modificá el código de las tres funciones para que cuenten cuántas comparaciones entre elementos de la lista realiza cada una. Por ejemplo, `ord_seleccion` realiza comparaciones (entre elementos de la lista) sólo cuando llama a `buscar_max(lista, a, b)` y en ese caso realiza `b-a` comparaciones.
326+
Definí una función `generar_lista(N)` que genere una lista aleatoria de largo N con números enteros del 1 al 1000 (puede haber repeticiones).
301327

302-
Realizá un experimento que genere una lista de largo `N` y la ordene con los tres métodos (burbujeo, inserción y selección).
328+
Copiá en tu programa el código de las tres funciones de ordenamiento y modificalas para que cuenten cuántas comparaciones entre elementos de la lista realiza cada una. Por ejemplo, `ord_seleccion` realiza comparaciones (entre elementos de la lista) sólo cuando llama a `buscar_max(lista, a, b)` y en ese caso realiza `b-a` comparaciones. Las funciones deben devolver la cantidad de comparaciones realizadas en vez de la lista ordenada y ya no deben imprimir nada.
329+
330+
```python
331+
>>> lista = [3, 2, -1, 5, 0, 2]
332+
>>> ord_seleccion(lista)
333+
15
334+
>>> lista = [5, 4, 3, 2, 1]
335+
>>> ord_burbujeo(lista)
336+
10
337+
```
338+
339+
Realizá un experimento que genere una lista de largo `N` y la ordene con los tres métodos (burbujeo, inserción y selección). Para esto, definí una función `experimento(N, k)` que repita `k` veces lo siguiente: generar una lista de largo `N`, ordenar la lista con los tres métodos y guardar la cantidad de operaciones. Al final, la función debe devolver el promedio de comparaciones realizadas con cada método.
340+
341+
La función debería comportarse de esta manera (los valores pueden variar, claro).
342+
343+
```python
344+
>>> experimento(10, 2)
345+
(45.0, 32.0, 25.0)
346+
347+
>>> experimento(5, 1000)
348+
(10.0, 7.705, 4.988)
349+
```
303350

304-
Para N = 10, realizá k = 100 repeticiones del siguiente experimento. Generar una lista de largo `N`, ordenarlas con los tres métodos y guardar la cantidad de operaciones. Al final, debe imprimir el promedio de comparaciones realizado por cada método.
351+
Para N = 10, realizá k = 100 repeticiones del siguiente experimento.
305352

306-
_Cuidado_: usá las mismas listas para los tres métodos así la comparación es justa.
353+
_Cuidado_: usá las mismas listas para los tres métodos así la comparación es justa. Recordá usar copias de la lista para que cada método deba ordenar la lista original.
307354

308355

309356
### Ejercicio 12.5: comparar métodos gráficamente
310-
Vamos a tratar de comparar visualmente la cantidad de comparaciones que hacen estos algoritmos para diferentes largos de listas. Hacé un programa `comparaciones_ordenamiento.py` que para `N` entre 1 y 256 genere una lista de largo `N` con números enteros del 1 al 1000 en orden aleatorio, calcule la cantidad de comparaciones realizadas por cada método de ordenamiento y guarde estos resultados en tres vectores de largo 256: `comparaciones_seleccion`, `comparaciones_insercion` y `comparaciones_burbujeo`.
357+
Vamos a tratar de comparar visualmente la cantidad de comparaciones que hacen estos algoritmos para diferentes largos de listas. En el programa `comparaciones_ordenamiento.py` definí una función `experimento_vectores(Nmax)` que para `N` entre 1 y `Nmax` genere una lista de largo `N` con números enteros del 1 al 1000 en orden aleatorio, calcule la cantidad de comparaciones realizadas por cada método de ordenamiento y guarde estos resultados en tres vectores de largo `Nmax`: `comparaciones_seleccion`, `comparaciones_insercion` y `comparaciones_burbujeo`.
311358

312359
Graficá estos tres vectores. Si las curvas se superponen, graficá una de ellas con línea punteada para poder verlas bien. ¿Cómo dirías que crece la complejidad de estos métodos? ¿Para cuáles depende de la lista a ordenar y para cuáles solamente depende del largo de la lista?
313360

Notas/12_Ordenamiento/03_Divide_and_Conquer.md

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -194,10 +194,12 @@ De esta manera se logra un tiempo proporcional a `N * log2(N)`.
194194
Ordená la lista `[6, 0, 3, 2, 5, 7, 4, 1]` usando el método merge sort. Dibujá el árbol de recursión explicando las llamadas que se hacen en cada paso, y el orden en el que se realizan, como mostramos más arriba para la lista `[3, 1, 0, 4, 2]`.
195195

196196
### Ejercicio 12.7:
197-
Modificá la función `merge_sort` para que también devuelva la cantidad de comparaciones hechas. Rehacé el último ejercicio de la sección anterior ([Ejercicio 12.5](../12_Ordenamiento/02_Ordenamiento_sencillo.md#ejercicio-125-comparar-metodos-graficamente)) incorporando el merge sort a la comparación y al gráfico. Describí con tus palabras qué observas.
197+
Modificá la función `merge_sort` para que también devuelva la cantidad de comparaciones hechas. Rehacé el último ejercicio de la sección anterior ([Ejercicio 12.5](../12_Ordenamiento/02_Ordenamiento_sencillo.md#ejercicio-125-comparar-metodos-graficamente)) incorporando el merge sort a la función `experimento_vectores(Nmax)` al gráfico. Describí con tus palabras qué observas.
198198

199199
Guardá el archivo `comparaciones_ordenamiento.py` con estas modificaciones, para entregarlo.
200200

201+
_Comentario: Como la función `merge_sort` está implementada de manera recursiva, vas a necesitar que devuelva la cantidad de comparaciones pero que no deje de devolver la lista ordenada. Sin embargo, para el experimento solamente necesitás extraer la información de las comparaciones._
202+
201203
## El módulo `timeit`
202204

203205
Hay casos en que contar la cantidad de operaciones que un algoritmo realiza se vuelve muy engorroso. Una alternativa simple aunque menos exacta es medir su tiempo de ejecución para problemas de distintos tamaños y estimar el orden del algoritmo a partir del cambio en el tiempo de ejecución al cambiar el tamaño del problema.
@@ -304,10 +306,9 @@ La idea de este ejercicio es, nuevamente, comparar los algoritmos de ordenamient
304306

305307
+ Juntá en el archivo `time_ordenamiento.py` los métodos de búsqueda del [Ejercicio 12.7](../12_Ordenamiento/03_Divide_and_Conquer.md#ejercicio-127).
306308

307-
+ Antes de empezar el experimento, eliminá de las funciones a medir todo código no esencial, en particular los prints para debug. Consumen tiempo y no son parte del algoritmo. También eliminá las cuentas de comparaciones, que ahora no son necesarias.
309+
+ Antes de empezar el experimento, eliminá de las funciones a medir todo código no esencial, por ejemplo si te quedó algún print. Consumen tiempo y no son parte del algoritmo. También eliminá todas las cuentas de comparaciones, que ahora no son necesarias.
308310

309-
+ Escribí un experimento que, tal como hiciste en el [Ejercicio 12.5](../12_Ordenamiento/02_Ordenamiento_sencillo.md#ejercicio-125-comparar-metodos-graficamente),
310-
para `N` entre 1 y 256 genere una lista de largo `N` con números enteros del 1 al 1000, calcule el tiempo que tarda cada método en ordenar la lista y guarde estos resultados en vectores de largo 256.
311+
+ Definí una función `experimento_timeit(Nmax)`, similar a `experimento_vectores(Nmax)` del [Ejercicio 12.5](../12_Ordenamiento/02_Ordenamiento_sencillo.md#ejercicio-125-comparar-metodos-graficamente), que para `N` entre 1 y `Nmax` genere una lista de largo `N` con números enteros del 1 al 1000 en orden aleatorio, calcule el tiempo que tarda cada método en ordenar la lista y guarde estos resultados en tres vectores de largo `Nmax`.
311312

312313
+ En este caso, vas a tener que generar y guardar todas las listas a ser utilizadas antes de correr el experimento, para poder usar las mismas repetidas veces al evaluar cada método. Definí para eso una función `generar_listas(Nmax)` que genere una lista de listas, una de cada longitud entre 1 y `Nmax`, con valores aleatorios entre 1 y 1000.
313314

@@ -319,7 +320,7 @@ para `N` entre 1 y 256 genere una lista de largo `N` con números enteros del 1
319320

320321

321322
### Ejercicio 12.9:
322-
Opcional: Escribí una función `merge3sort` que funcione igual que el merge sort pero en lugar de dividir la lista de entrada en dos partes, la divida en tres partes. Deberás escribir la función `merge3(lista1, lista2, lista3)`.
323+
Opcional: Escribí una función `merge3sort` que funcione igual que el merge sort pero en lugar de dividir la lista de entrada en dos partes, la divida en tres partes. Deberás escribir la función `merge3sort(lista1, lista2, lista3)`.
323324

324325
Probá tu función en las siguientes listas:
325326

@@ -328,7 +329,7 @@ unalista = [1, 4, 3, 1, 7, 5]
328329
otralista = [7, 6, 5, 4, 3, 2, 1, 0]
329330
```
330331

331-
¿Cómo te parece que se va a comportar este método con respecto al merge sort original? Agregá este nuevo método a la comparación del ejercicio anterior.
332+
¿Cómo te parece que se va a comportar este método con respecto al merge sort original? Agregá este nuevo método a la comparación del ejercicio anterior. Ojo: no modifiques el archivo `time_ordenamiento.py` que tenés que entregar en el ejercicio anterior, de manera que lo podamos evaluar adecuadamente.
332333

333334

334335

0 commit comments

Comments
 (0)