Análisis asintótico: algoritmos recursivos e iterativos



Documentos relacionados
Sistemas Digitales Ingeniería Técnica en Informática de Sistemas Curso Aritmética binaria

Sorting++ Herman Schinca. Clase de Junio de 2011

PRÁCTICA N 2 SISTEMAS DE NUMERACIÓN

Ejemplos de conversión de reales a enteros

Programación de Sistemas

Informática 1 Sistemas numéricos: decimal, binario, octal y hexadecimal FCFA Febrero 2012

Recomendaciones para elaborar bases de datos

Matemáticas para la Computación

Curso PHP Módulo 1 R-Luis

Motores de Búsqueda Web Tarea Tema 2

Álgebra y Matemática Discreta Sesión de Prácticas 1

ANEXO 2: REPRESENTACION DE LA INFORMACION EN LOS COMPUTADORES

ARREGLOS DEFINICION GENERAL DE ARREGLO

5 Ecuaciones lineales y conceptos elementales de funciones

Tema I. Sistemas Numéricos y Códigos Binarios

Para cerrar Excel, puedes utilizar cualquiera de las siguientes operaciones:

Llamamos potencia a todo producto de factores iguales. Por ejemplo: 3 4 =

Unidad I. 1.1 Sistemas numéricos (Binario, Octal, Decimal, Hexadecimal)

SITEMA BINARIO, OCTAL Y HEXADECIMAL: OPERACIONES

LABORATORIO Nº 2 GUÍA PARA REALIZAR FORMULAS EN EXCEL

Distinguir las diferentes estructuras de repetición utilizadas en problemas con ciclos: mientras, haga-mientras, repita-hasta, para.

Ámbito Científico-Tecnológico Módulo III Bloque 2 Unidad 1 Quien parte y reparte, se lleva la mejor parte

Comparar las siguientes ecuaciones, y hallar sus soluciones:

Objetivo: Introducción conceptual y aplicación básica de los lenguajes del lado del servidor.

CREAR TICKETS DE SOPORTE

Administración de proyectos. Organizar, planificar y programar los proyectos de software

Que es PHP? Que se puede hacer con PHP? Sintaxis del lenguaje. Variables. Operadores básicos. Condicionales. Ciclos.

Ejemplo: Resolvemos Sin solución. O siempre es positiva o siempre es negativa. Damos un valor cualquiera Siempre + D(f) =

Etiquetas. Etiquetas. Listados de etiquetas

Dra. Carmen Ivelisse Santiago Rivera 1 MÓDULO DE LOS ENTEROS. Por profesoras: Iris Mercado y Carmen Ivelisse Santiago GUÍA DE AUTO-AYUDA

SIIGO Pyme. Procesos Gestión de Ventas. Cartilla I

Wise Up Kids! En matemáticas, a la división de un objeto o unidad en varias partes iguales o a un grupo de esas divisiones se les denomina fracción.

Guía para la Oficina Virtual

Índice Introducción Estructuras Algebraicas Listas Los Números Enteros Polinomios. Álgebra y Matemática Discreta Sesión de Prácticas 1

HERRAMIENTA DE FORMACIÓN

En cualquier caso, tampoco es demasiado importante el significado de la "B", si es que lo tiene, lo interesante realmente es el algoritmo.

Divisibilidad y números primos

Sistemas de numeración

QUÉ ES UN NÚMERO DECIMAL?

Al adquirir Gear Online se hará entrega del modulo de parámetros en cual podemos parametrizar todas las características de todas las áreas que

Análisis de los datos

x

MANUAL DE AYUDA MODULO TALLAS Y COLORES

GUIA DE MATERIAL BASICO PARA TRABAJAR CON DECIMALES.

Manual de uso. Manual de uso - citanet 1

Un vistazo a la calle revela que hay una gran cantidad de vehículos con arañazos o

Anterior Sistemas binarios: Aritmética binaria Siguiente ARITMÉTICA BINARIA. Operaciones elementales con números binarios

Matrices Invertibles y Elementos de Álgebra Matricial

Operación de Microsoft Excel. Guía del Usuario Página 79. Centro de Capacitación en Informática

Configuración de la impresión de Cheques/pagarés

Límite de una función

NÚMEROS NATURALES Y NÚMEROS ENTEROS

TABLA DE DECISION. Consideremos la siguiente tabla, expresada en forma genérica, como ejemplo y establezcamos la manera en que debe leerse.

Curso de Python Inicial

PRÁCTICAS DE GESTIÓN GANADERA:

SIIT SISTEMA INFORMÁTICO DE INSPECCIONES DE TRABAJO. Modulo de Planificación Manual de Usuario

UNIDADES FUNCIONALES DEL ORDENADOR TEMA 3

Modulo 1 El lenguaje Java

Ampliación de Estructuras de Datos

Analisis de algoritmos

SISTEMAS DE NUMERACIÓN.

Como registrar tu Equipo en un Evento

EJERCICIOS SOBRE : DIVISIBILIDAD

Tema 2. La Información y su representación

SIIGO Pyme. Templates. Cartilla I

PARTE 3 ECUACIONES DE EQUIVALENCIA FINANCIERA T E M A S

A25. Informática aplicada a la gestión Curso 2005/2006 Excel Tema 7. Funciones avanzadas de Excel II

EDWIN KÄMMERER ORCASITA INGENIERO ELECTRÓNICO

Los números racionales

Estructura de datos y de la información Boletín de problemas - Tema 7

Capítulo 12: Indexación y asociación

Seminario Profesional MS PROJECT MODULO 2: Introducción y organización de las tareas

LECCIÓN 10 DASHBOARD. Cómo añadir Gráficos al Dashboard?

Modificación y parametrización del modulo de Solicitudes (Request) en el ERP/CRM Compiere.

ESTRATEGIAS DE CÁLCULO MENTAL CON MULTIPLICACIONES Y DIVISIONES EN EL 2º CICLO DE PRIMARIA. José Ramón Gregorio Guirles (*)

MANUAL DE CUOTA EN UNIDADES POR TERRITORIO

UNIDAD EJECUTORA DE CONSERVACION VIAL MANUAL DEL USUARIO DEL SISTEMA INTEGRAL DE CONTROL DE PROYECTOS

Operaciones con polinomios

Lección 24: Lenguaje algebraico y sustituciones

Manual para la utilización de PrestaShop

JOSÉ PERAZA, FÍSICA 2 JOSÉ PERAZA, FÍSICA 2 JOSÉ PERAZA, FÍSICA 2 Energía Potencial eléctrica

Computación I Representación Interna Curso 2011

1.1. Introducción y conceptos básicos

Capítulo 4 Procesos con estructuras de repetición

2.- Diseño del comportamiento: Diagrama de actividades. Mª Antonia Zapata

Universidad Católica del Maule. Fundamentos de Computación Especificación de tipos de datos ESPECIFICACIÓN ALGEBRAICA DE TIPOS DE DATOS

1. Dominio, simetría, puntos de corte y periodicidad

MATERIAL 2 EXCEL 2007

Manual para el uso del Correo Electrónico Institucional Via Webmail

EL MODELO DE ESTRATIFICACIÓN POR CAPAS DE TCP/IP DE INTERNET

DOMINIO Y RANGO DE UNA FUNCIÓN I N D I C E. martilloatomico@gmail.com. Página. Titulo:

MANUAL DE USUARIO INTRANET

UNIDAD 6. POLINOMIOS CON COEFICIENTES ENTEROS

Algoritmos y Estructuras de Datos II

Estructuras de datos: Proyecto 2

3.4.-INDICES DIARIOS DE LA BOLSA DE MADRID

SISTEMA DE AMORTIZACION. Tomado de :

Capitulo V Administración de memoria

Transcripción:

Análisis asintótico: algoritmos recursivos e iterativos Frank Sebastián Franco Hernández 22 de agosto de 2014 1. Análisis de tres algoritmos de ordenamiento 1.1. Algoritmo BubbleSort Este algoritmo funciona como las burbujas dentro del agua: dejando las más pesadas (mayores) en los últimos lugares del arreglo a ordenar y las más livianas (menores) en los primeros lugares. En principio el fundamento es simple: declara dos iteradores: uno para el array completo y otro que reorganizará el arreglo. Si lo que está indicado por el primer iterador es menor que lo que tiene el segundo, se mantienen lugares, y de lo contrario se intercambian. El simple hecho de tener dos iteradores implica que el orden de este algoritmo es de O(n 2 ). 1.2. Algoritmo Insertion Sort Este algoritmo utiliza el mismo principio que cuando uno organiza cartas en una mano, organizando progresivamente las mismas de izquierda a derecha, de menor a mayor. Empieza con un iterador externo, fija un valor temporal y crea un nuevo iterador, que entrará siempre que se cumpla que el iterador sea mayor que cero y que el arreglo en el iterador sea mayor que el valor temporal. Una vez dentro de ese iterador, se asigna la posición en la que está, a la posición anterior y el temporal se pone en la posición en la que quedó. Como son dos iteradores, el orden sigue siendo de O(n 2 ). 1.3. Algoritmo Merge Sort Se trata de un algoritmo de dividir y vencer. En principio se promedian los índices inicial y final del arreglo, con el fin de enviar eso a la recursión. Ya con el array dividido, se sigue dividiendo hasta que queden arreglos de tamaño 1. Se ordena cada pedazo y se va fusionando asimismo el arreglo. El hecho de dividir el arreglo por mitades, ya hace el algoritmo de orden logarítmico; pero como se iteran sobre esas divisiones, ya hace que sea de orden O(n log n). 1

2. Algoritmos en Python 2.1. Algoritmo Bubble Sort def b u b b l e s o r t ( A ) : f o r i in range ( l e n ( A ) ) : f o r k in range ( l e n ( A ) 1, i, 1 ) : i f ( A[ k ] < A[ k 1 ] ) : tmp= A[ k ] A[ k]=a[ k 1] A[ k 1]=tmp b u b b l e s o r t ( l i s t a ) Los tiempos de ejecución de dicho algoritmo en un procesador Intel Core i3 (el que se está utilizando) son los de crecimiento más rápido. Con arreglos de tamaño 250 tarda 18 milisegundos, con 500 tarda 66 milisegundos (3 y dos tercios de vez más), con 1000 tarda 275 milisegundos (4.16 veces más), con 1500 tarda casi 1 segundo (916 milisegundos siendo exactos, unas 3.3 veces más) y con 2000 tardó casi 2 segundos (1,985 segundos; dos veces y un octavo más). Sabemos que un crecimiento cuadrático implica que cuando se duplica el número que se tiene en la entrada, se cuadruplica la salida, lo cual se hace patente en este procedimiento. 2.2. Algoritmo Insertion Sort def i n s e r t i o n s o r t ( a L i s t ) : f o r i in range ( 1, l e n ( a L i s t ) ) : tmp = a L i s t [ i ] k = i while k > 0 and tmp < a L i s t [ k 1 ] : a L i s t [ k ] = a L i s t [ k 1 ] k = 1 2

a L i s t [ k ] = tmp i n s e r t i o n s o r t ( l i s t a ) Aquí ya empieza a mejorar un poco la situación, hablando de tiempos de ejecución. Con el procesador utilizado, con arreglos de tamaño 250 tardó 16 milisegundos, con 500 tardó 53 milisegundos (poco más de 3 veces más), con 1000 tardó 271 milisegundos (poco más de 5 veces más) y con 2000 tardó poco más de 1 segundo (1,021 s), teniendo en 1500 un tiempo cercano a las 500 milésimas de segundo (0,542 s). En este caso, el algoritmo, aunque pareciera tener un comportamiento marcadamente cuadrático al principio, tiende a estabilizarse. 2.3. Algoritmo Merge Sort def mergesort ( a L i s t ) : mergesort ( alist, 0, l e n ( a L i s t ) 1 ) def mergesort ( alist, f i r s t, l a s t ) : # break problem i n t o s m a l l e r s t r u c t u r a l l y i d e n t i c a l p i e c e s mid = ( f i r s t + l a s t ) / 2 i f f i r s t < l a s t : mergesort ( alist, f i r s t, mid ) mergesort ( alist, mid + 1, l a s t ) # merge s o l v e d p i e c e s to get s o l u t i o n to o r i g i n a l problem a, f, l = 0, f i r s t, mid + 1 tmp = [ None ] ( l a s t f i r s t + 1 ) while f <= mid and l <= l a s t : i f a L i s t [ f ] < a L i s t [ l ] : tmp [ a ] = a L i s t [ f ] f += 1 e l s e : tmp [ a ] = a L i s t [ l ] l += 1 3

a += 1 i f f <= mid : tmp [ a : ] = a L i s t [ f : mid + 1 ] i f l <= l a s t : tmp [ a : ] = a L i s t [ l : l a s t + 1 ] a = 0 while f i r s t <= l a s t : a L i s t [ f i r s t ] = tmp [ a ] f i r s t += 1 a += 1 mergesort ( l i s t a ) Es sin duda, el más rápido de los tres y es quien organizó los 10000 arreglos en un tiempo razonable. La magnitud de la rapidez de este algoritmo, comparándolo con los otros dos, es que un arreglo de tamaño en el rango de los 9000 lo organiza en tiempos en los que los otros dos organizarían apenas en el rango de los 1000, haciéndole aproximadamente 9 o más veces más rápido que los otros dos. 3. Multiplicación dentro de un arreglo def multi ( a, x ) : #a es una l i s t a, x es un v a l o r entero f o r i in range ( l e n ( a ) ) : i f x %a [ i ]==0 and x/a [ i ] in a : # e l operador in pregunta s i e x i s t e t a l e p r i n t Los numeros de e s t e a r r e g l o que m u l t i p l i c a d o s dan +x + so e l s e : r eturn No hay numeros que s a t i s f a g a n l a c o n d i c i o n Recibe una lista de tamaño cualquiera y un valor entero cualquiera. Itera sobre la lista preguntando si el módulo entre el valor entero y el elemento i-ésimo de la lista es cero y si el cociente entre el entero y ese mismo valor existe en la lista (Python provee un operador llamado in que permite hacer esto en una sola línea). Con ambas condiciones verdaderas, el algoritmo devuelve por pantalla el resultado. De lo contrario, imprime que no existe número alguno dentro del arreglo que satisfaga la condición. 4

4. Análisis de un algoritmo recursivo Con el procesador utilizado, el algoritmo terminaba con errores de desbordamiento de pila (o directamente se moría) en cualquier lenguaje (Python, Java o C++), así que se optó por el uso de Excel para hacer dicha función, porque se optó por imprimir todos los casos posibles. El promedio de llamadas para cada número es de casi 87 (86,9664), siendo el menor cuando apenas inicia (1) y el mayor situándose en 9225, teniendo 259 llamadas recursivas para llegar al caso base. La cantidad de llamadas por cada número es demasiado fluctuante, no sigue un patrón en específico, aunque se sabe al menos que los números pares requieren de menos llamadas recursivas que los impares. Es impracticable poner la tabla y el gráfico porque son de enormes dimensiones, por lo que se incluyen en archivo adjunto, llamado función.xlsx. 5