Está en la página 1de 24

ALUMNO: ROLANDO ORTIZ HERBAS – CARRERA: LIC.

MATEMATICAS UNADM

Materia: Computación I

Alumno: Rolando Ortiz Herbas

e-mail: maasher7@hotmail.com
rolandoortiz@nube.unadmexico.mx

Grupo: MT-MCOM1-1902-B2-001

Matricula: ES1821014044

Maestra: José Luis Mondragón Diego

Fecha: 21-Oct-2019

Unidad U2 A3 Ordenamiento y Búsqueda

Carrera: Lic. en Matemáticas

1
ALUMNO: ROLANDO ORTIZ HERBAS – CARRERA: LIC. MATEMATICAS UNADM

Responde las siguientes preguntas


1.- ¿Cuál es la complejidad de búsqueda en un árbol binario y por qué?
Vamos a suponer que es un árbol binario ordenado para el recorrido en In-orden,
como el siguiente :

El algoritmo de búsqueda en un árbol binario en Python es :

Análisis de Complejidad.-

2
ALUMNO: ROLANDO ORTIZ HERBAS – CARRERA: LIC. MATEMATICAS UNADM

i) En el peor de los casos el árbol se convierte en una lista encadenada, entonces la


complejidad es Ο(𝑛), 𝑝𝑜𝑟𝑞𝑢𝑒 ℎ𝑎𝑟í𝑎 𝑛 𝑐𝑜𝑚𝑝𝑎𝑟𝑎𝑐𝑖𝑜𝑛𝑒𝑠 𝑝𝑎𝑟𝑎 𝑒𝑛𝑐𝑜𝑛𝑡𝑟𝑎𝑟 𝑢𝑛 𝑖𝑡𝑒𝑚.
Y en el ultimo ejercicio de esta actividad se prueba que si es un árbol balanceado la
complejidad es Ο(𝑙𝑜𝑔2 (𝑛)).

2.-Investiga el algoritmo y complejidad de los siguientes algoritmos de


ordenamiento
Sin perder generalidad un vector k de tamaño n , esta en orden ascendente si
i < j implica que k[i] <= k[j] , para todo i,j =1,2,…,n
y se dice que está en orden descendente si:
i > j implica que k[i] <= k[j] , para todo i,j=1,2,…,n
2.1. BubbleSort.-
Ordenamiento ascendente del método de las burbujas en Python:

3
ALUMNO: ROLANDO ORTIZ HERBAS – CARRERA: LIC. MATEMATICAS UNADM

4
ALUMNO: ROLANDO ORTIZ HERBAS – CARRERA: LIC. MATEMATICAS UNADM

Análisis de Complejidad método de las burbujas.-


• La primera vez que i = 0, la instrucción if se realiza n veces donde n es el
tamaño del vector.
• La segunda vez se realizará n-1 veces.
• La tercera vez se realizará n-2 veces
• La vez n se realizará 1 vez.
Esto es: 1 + 2+. . +(𝑛 − 1) + 𝑛 ≤ 𝑛 + 𝑛 + ⋯ + 𝑛 = (1 + 1 + ⋯ + 1)𝑛 = 𝑛 ∗ 𝑛
1 + 2+. . +(𝑛 − 1) + 𝑛 = Ο(𝑛2 )

Shell Sort .-
Crea una secuencia tal que si n es el tamaño del vector a ordenar

5
ALUMNO: ROLANDO ORTIZ HERBAS – CARRERA: LIC. MATEMATICAS UNADM

𝑛
ℎ1 = ⌊ ⌋
2
ℎ1
ℎ2 = ⌊ ⌋
2
.
ℎ𝑘 = 1
Se realizan los intercambios entre 𝑘[1] 𝑦 𝑘[ℎ1 + 1] , recorriendo todo el vector.
Paso 2 vez se intercambia entre 𝑘[1] 𝑦 𝑘[ℎ2 + 1], 𝑟𝑒𝑐𝑜𝑟𝑟𝑖𝑒𝑛𝑑𝑜 𝑡𝑜𝑑𝑜 𝑒𝑙 𝑣𝑒𝑐𝑡𝑜𝑟
Hasta que se hacen intercambios adyacentes.

Programa en Python:

6
ALUMNO: ROLANDO ORTIZ HERBAS – CARRERA: LIC. MATEMATICAS UNADM

7
ALUMNO: ROLANDO ORTIZ HERBAS – CARRERA: LIC. MATEMATICAS UNADM

Análisis de complejidad del método de ordenamiento Shell sort.-


El análisis de complejidad de Shell Sort es bastante complejo, y requiere la
demostración de algunos teoremas de alguna dificultad , solo de manera
enunciativa diremos que este método es de complejidad
𝚶(𝒏 ∗ 𝒍𝒐𝒈𝟐 𝒏)
Para ver una demostración ver el libro Sorting and Searching Vol. 3 de Donald
Knuth pagina 129 .

Radix Sort.-
Aprovecha la estrategia de la forma más antigua de clasificación manual,
consistente en hacer diversos montones

8
ALUMNO: ROLANDO ORTIZ HERBAS – CARRERA: LIC. MATEMATICAS UNADM

de fichas, cada uno caracterizado por tener sus componentes un mismo dígito
(letra, si es alfabética) en la misma posición;
estos montones se recogen en orden ascendente y se reparte de
nuevo en montones según el siguiente dígito de la clave.
Como ejemplo, suponer que se han de ordenar estas fichas identificadas por tres
dígitos:
345, 721, 425, 572, 836, 467, 672,194, 365, 236, 891, 746, 431, 834, 247, 529, 216,
389
Atendiendo al dígito de menor peso (unidades) las fichas se distribuyen en

Recogiendo los montones en orden, la secuencia de fichas queda:


721, 891, 431, 572, 672, 194, 834, 345, 425, 365, 836, 236, 746, 216, 467, 247, 529,
389
De esta secuencia podemos decir que está ordenada respecto al dígito de menor
peso, respecto a las unidades.
Pues bien, ahora de nuevo se distribuye la secuencia de fichas en montones
respecto al segundo dígito:

9
ALUMNO: ROLANDO ORTIZ HERBAS – CARRERA: LIC. MATEMATICAS UNADM

Recogiendo de nuevo los montones en orden, la secuencia de fichas queda:


216, 721, 425, 529, 431, 834, 836, 236, 345, 746, 247, 365, 467, 572, 672, 389, 891,
194
En este momento esta secuencia de fichas ya están ordenadas respecto a los dos
últimos dígitos,
es decir, respecto a las decenas. Por último, se distribuye las fichas en montones
respecto al tercer
dígito:

Recogiendo de nuevo los montones en orden, la secuencia de fichas queda ya


ordenada:
194, 216, 236, 247, 345, 365, 389, 425, 431, 467, 529, 572, 672, 121, 746, 834, 836,
891
Algoritmo Radix sort en Python

10
ALUMNO: ROLANDO ORTIZ HERBAS – CARRERA: LIC. MATEMATICAS UNADM

Análisis de complejidad Radix Sort.-


Este algoritmo depende de 3 parámetros:
n= el tamaño del vector.

11
ALUMNO: ROLANDO ORTIZ HERBAS – CARRERA: LIC. MATEMATICAS UNADM

d = numero de dígitos que tiene el numero.


b = igual a la base del numero, en este caso, como son números decimales , la
base es 10.
En este algoritmo, como máximo se hacen n+b comparaciones y como cada
numero tiene como máximo d dígitos, tenemos que se hacen:
𝒅 ∗ (𝒏 + 𝒃) 𝒄𝒐𝒎𝒑𝒂𝒓𝒂𝒄𝒊𝒐𝒏𝒆𝒔 𝒄𝒐𝒎𝒐 𝒎𝒂𝒙𝒊𝒎𝒐, 𝒆𝒔𝒕𝒐 𝒆𝒔 𝚶(𝒏 + 𝒌)

Merge Sort.-

12
ALUMNO: ROLANDO ORTIZ HERBAS – CARRERA: LIC. MATEMATICAS UNADM

13
ALUMNO: ROLANDO ORTIZ HERBAS – CARRERA: LIC. MATEMATICAS UNADM

Análisis de complejidad de Merge-Sort.-


Procedimiento : si queremos ordenar el siguiente vector

Se precede a dividir en vector en sub-listas de la siguiente manera

14
ALUMNO: ROLANDO ORTIZ HERBAS – CARRERA: LIC. MATEMATICAS UNADM

Una vez que se ha dividido las sub-Listas, la mezcla comienza con las sub-listas de
un solo elemento, que dan lugar a otra sub-lista del doble de elementos
ordenados. El proceso continúa hasta que se construye un única lista ordenada. A
continuación se muestra la creación de las sub-listas ordenadas:

Análisis de Complejidad de Merge-Sort.-


Para analizar la función mergeSort, debemos considerar los dos procesos distintos
que conforman su implementación. Primero, la lista se divide en mitades. Este
proceso es similar a una búsqueda binaria, en la que dividimos una lista en mitades
donde n es la longitud de la lista.
El segundo proceso es la fusión. Cada elemento de la lista finalmente se procesará
y se colocará en la lista ordenada. Entonces, la operación de fusión que da como
resultado una lista de tamaño n requiere n operaciones. El resultado de este análisis
es que se divide en 𝐥𝐨𝐠(𝒏), cada uno de los cuales se realiza en n pasos, para un
total de operaciones 𝒏 ∗ 𝒍𝒐𝒈𝟐 𝒏. Entonces el Merge-Sort es un algoritmo
𝚶(𝒏 ∗ 𝒍𝒐𝒈𝟐 𝒏).

Quick Sort.- (Extracto del libro Algoritmos de ordenación y búsqueda)

15
ALUMNO: ROLANDO ORTIZ HERBAS – CARRERA: LIC. MATEMATICAS UNADM

“ La idea del algoritmo es simple, se basa en la división en particiones de la lista a


ordenar, por lo que se puede considerar que aplica la técnica divide y vencerás.
El método es, posiblemente, el más pequeño de código, más rápido, más elegante,
más interesante y eficiente de los algoritmos de ordenación conocidos.
El método se basa en dividir los n elementos de la lista a ordenar en dos partes o
particiones separadas por un elemento:
una partición izquierda, un elemento central denominado pivote o
elemento de partición, y una partición derecha. La partición o división se hace de tal
forma que todos los elementos de la primera sublista (partición izquierda)
son menores que todos los elementos de la segunda sublista (partición derecha).
Las dos sublistas se ordenan entonces independientemente.
Para dividir la lista en particiones (sublistas) se elige uno de los elementos de la lista
y se utiliza como pivote o elemento de partición.
Si se elige una lista cualquiera con los elementos en orden aleatorio,
se puede seleccionar cualquier elemento de la lista como pivote, por ejemplo, el
primer elemento de la lista. Si la lista tiene algún orden parcial conocido, se puede
tomar otra decisión para el pivote.
Idealmente, el pivote se debe elegir de modo que se divida la lista exactamente
por la mitad, de acuerdo al tamaño relativo de las claves.
Por ejemplo, si se tiene una lista
de enteros de 1 a 10, 5 o 6 serían pivotes ideales, mientras que 1 o 10 serían
elecciones «pobres»
de pivotes.
Una vez que el pivote ha sido elegido, se utiliza para ordenar el resto de la lista en
dos sublistas:

16
ALUMNO: ROLANDO ORTIZ HERBAS – CARRERA: LIC. MATEMATICAS UNADM

una tiene todas las claves menores que el pivote y la otra, todos los elementos
(claves) mayores que o iguales que el pivote (o al revés).
Estas dos listas parciales se ordenan recursivamente utilizando el mismo algoritmo;
es decir, se llama sucesivamente al propio algoritmo Quicksort.
La lista final ordenada se consigue concatenando la primera sublista,
el pivote y la segunda lista, en ese orden, en una única lista.
La primera etapa de Quicksort es la división o «particionado» recursivo de la lista
hasta que todas las sublistas constan de sólo un elemento”.

17
ALUMNO: ROLANDO ORTIZ HERBAS – CARRERA: LIC. MATEMATICAS UNADM

18
ALUMNO: ROLANDO ORTIZ HERBAS – CARRERA: LIC. MATEMATICAS UNADM

Análisis de Complejidad de Quick Sort.-


El análisis de complejidad del quick sort es bastante difícil y necesita matemática
superior, pero se simplifica bastante si se considera que n la cantidad de números
a ordenar es de la forma 𝒏 = 𝟐𝒌 𝒆𝒔 𝒅𝒆𝒄𝒊𝒓 𝒍𝒐𝒈𝟐 𝒏 = 𝒌.
Además hay que suponer una situación ideal donde el pivote o en el programa
Python 𝑥 = 𝑣𝑒𝑐𝑡𝑜𝑟 [𝑚𝑒𝑑𝑖𝑜] es el elemento central entonces este pivote divide el
vector en 2 sub-lista aproximadamente del mismo tamaño.
En el primer recorrido son n-1 comparaciones las que se realizan. Además se
definen 2 sub listas de aproximadamente n/2 elementos cada una. En el paso
siguiente el proceso de cada sub-lista requiere n/2 comparaciones. Las
comparaciones totales en las 2 sub-lista son 2*(n/2) = n.
En el siguiente paso son 4*(n/2) = n y así sucesivamente hasta que las sub-listas
tengan solo 1 elemento y en este caso las comparaciones son n*(n/n).
La cantidad de comparaciones sería la siguiente sumatoria :
𝑛 𝑛 𝑛
𝑛 + 2 ∗ + 4 ∗ + ⋯ + 𝑛 ∗ = 𝑛 + 𝑛 + ⋯ + 𝑛 = 𝑘𝑛
2 4 𝑛

Como 𝒍𝒐𝒈𝟐 𝒏 = 𝒌 entonces :

19
ALUMNO: ROLANDO ORTIZ HERBAS – CARRERA: LIC. MATEMATICAS UNADM

𝒌𝒏 = 𝒏 ∗ 𝒍𝒐𝒈𝟐 𝒏
Entonces el método quick sort es de complejidad 𝚶(𝒏 ∗ 𝒍𝒐𝒈𝟐 𝒏)

3.- Supón que tienes que implementar un sistema de administración de alumnos


y decides organizarlos en las siguientes estructuras de datos ¿Cuánto tardarías
en acomodar a un alumno nuevo en cada una de ellas?
3.1) Lista ligada.- (NOTA.- este algoritmo ya se desarrollo en anterior actividad)

Vamos a suponer que es una lista ordenada entonces la operación de agregar o


insertar información queda en Python, como sigue:

Analizaremos por casos :


• Si queremos insertar un elemento menor, por ejemplo 10 en la lista
encadenada anterior, entonces se realizará 1 comparación con el ítem 17 y
se insertará al principio de la lista. La complejidad en este caso es: 𝚶(𝟏)

• Si queremos insertar por ejemplo 200 en la lista anterior entonces se


realizará n comparaciones con todos los ítems de la lista y se insertará al final
de la lista . La complejidad en este caso es : 𝚶(𝒏)

• Si el elemento esta en una posición arbitraria en medio, podemos tomar el


promedio :

20
ALUMNO: ROLANDO ORTIZ HERBAS – CARRERA: LIC. MATEMATICAS UNADM

𝟏+𝒏 𝟏 𝒏
= + < |𝑪| ∗ 𝒏 , 𝒑𝒂𝒓𝒂 𝒏 ≥ 𝟐 . 𝑷𝒐𝒓 𝒍𝒐 𝒕𝒂𝒏𝒕𝒐 𝚶(𝒏)
𝟐 𝟐 𝟐

3.2) Lista doblemente ligada.-

Para una lista doblemente encadenada tenemos que en el caso de que agregamos
un elemento mucho menor a los que tiene la lista o uno mayor que todos los
elementos de la lista , realizamos 1 comparación, ya sea por izquierda o derecha.

En el caso que agreguemos en medio de la lista, realizamos :


𝑛−2 𝑛
𝑛 − 2 𝑐𝑜𝑚𝑝𝑎𝑟𝑎𝑐𝑖𝑜𝑛𝑒𝑠 𝑜 𝑠𝑒𝑎 𝑒𝑛 𝑝𝑟𝑜𝑚𝑒𝑑𝑖𝑜 = − 1 𝑞𝑢𝑒 𝑒𝑠 𝜪(𝒏)
2 2

3.3) Árbol balanceado.- (AVL)

Definición de un árbol balanceado (AVL)

21
ALUMNO: ROLANDO ORTIZ HERBAS – CARRERA: LIC. MATEMATICAS UNADM

• Para poder determinar si un árbol está balanceado o no, debe manejarse


información relativa al equilibrio de cada nodo del árbol. Surge así el
concepto de factor de equilibrio de un nodo (FE) que se define como: la
altura del subárbol derecho menos la altura del subárbol izquierdo.

FE=HRD-HRI
• Se debe considerar que cada operación de inserción y eliminación puede
alterar el equilibrio del árbol.
• Por lo cual es necesario revisar por cada operación el factor de equilibrio de
cada nodo involucrado en el camino de búsqueda y si el equilibrio es
afectado, será necesario realizar una reestructuración del árbol.
• El proceso termina al llegar a la raíz del árbol, o cuando se realiza la
reestructuración del mismo; en cuyo caso no es necesario determinar el FE
de los restantes nodos.

22
ALUMNO: ROLANDO ORTIZ HERBAS – CARRERA: LIC. MATEMATICAS UNADM

Por la definición de un árbol balanceado AVL, tenemos que para cualquier nodo el
sub-arbol derecho varia a lo mucho en 1 nivel del sub-arbol izquierdo y viceversa.
Supondremos que el numero de nodos que tiene el árbol es de la forma :
𝑛 = 2𝑘
Y por otro lado vemos que el numero de nodos por nivel es:
Nivel 0 20 = 1
Nivel 1 21 = 2
Nivel 2 22 = 4

Nivel k 2𝑘

𝑬𝒏𝒕𝒐𝒏𝒄𝒆𝒔 𝒏 = 𝟐𝟎 + 𝟐𝟏 + ⋯ + 𝟐𝒌
𝒍𝒐𝒈𝟐 𝒏 = 𝟎 ∗ 𝒍𝒐𝒈𝟐 𝟐 + 𝟏 ∗ 𝒍𝒐𝒈𝟐 𝟐 + ⋯ + 𝒌 ∗ 𝒍𝒐𝒈𝟐 𝟐 = 𝟏 + 𝟐 + ⋯ + 𝒌

23
ALUMNO: ROLANDO ORTIZ HERBAS – CARRERA: LIC. MATEMATICAS UNADM

𝑬𝒏𝒕𝒐𝒏𝒄𝒆𝒔 𝒆𝒍 𝒂𝒓𝒃𝒐𝒍 𝑨𝑽𝑳 𝒆𝒔 𝒅𝒆 𝒄𝒐𝒎𝒑𝒍𝒆𝒋𝒊𝒅𝒂𝒅 𝚶(𝒍𝒐𝒈(𝒏))


Esto se cumple tanto para la Búsqueda, como inserción y borrado de información
en un árbol balanceado AVL.

Bibliografía (formato APA):


• Apuntes UnadM, Computación I, 2019, UNADM.
• J. Hopcroft - R. Motwani - J. Ullman, Teoría de Autómatas, Lenguajes y
Computación, 2007, Pearson
• D. Knuth, El arte de programar ordenadores Vol. I,1990, Reverté
• N. Wirth, Algoritmos + Estructura de Datos = Programas, 1993, Prentice Hall
• [KNUTH 1998] Donald E. Knuth. The Art of Computer Programming. Volume
3: Sorting and Searching. Second Edition, 1998,Addison-Wesley.

24

También podría gustarte