Está en la página 1de 60

8 Algoritmos

Fundamentos de Ciencias de la Computación • Aprendizaje Cengage


8.1
objetivos
Después de estudiar este capítulo, el estudiante debe ser capaz de:

• Definir un algoritmo y relacionarlo con la resolución de problemas.

• Definir tres constructo y describir su uso en algoritmos.

• Describir los diagramas UML y pseudocódigo y la forma en que se utilizan en los


algoritmos.

• Enumerar los algoritmos básicos y sus aplicaciones.

• Describir el concepto de clasificación y entender los mecanismos detrás de


tres algoritmos de ordenación primitivas.

• Describir el concepto de la búsqueda y entender los mecanismos detrás


de dos algoritmos de búsqueda común.

• Definir subalgoritmos y sus relaciones con los algoritmos.

• Distinguir entre los algoritmos iterativos y recursivos


8.2
8-1 CONCEPTO

En esta sección definimos un informalmente algoritmo y trabajar sobre


el concepto con un ejemplo.

8.3
definición informal

Una definición informal de un algoritmo es:

yo

Algoritmo: un método paso a paso para la solución de un

problema o hacer una tarea.

Figura 8.1 definición informal de un algoritmo utilizado en un ordenador


8.4
Ejemplo
Queremos desarrollar un algoritmo para encontrar el mayor número entero entre una lista
de números enteros positivos.
El algoritmo debe encontrar el número entero más grande entre una lista de los
valores (por ejemplo 5, 1000, 10000, 1000000). El algoritmo debe ser general y
no depende de la cantidad de números enteros.

Para resolver este problema, necesitamos un enfoque intuitivo. En primer lugar utilizar un

pequeño número de enteros (por ejemplo, cinco), a continuación, extender la solución a

cualquier número de enteros.

La figura 8.2 muestra una forma de resolver este problema. El algoritmo recibe una
lista de cinco enteros como entrada y proporciona el mayor entero como salida.

8.5
Figura 8.2 Encontrar el número entero más grande entre cinco enteros

8.6
Definición de acciones
Figura 8.2 no muestra lo que debe hacerse en cada paso. Podemos modificar la
cifra para mostrar más detalles.

Figura 8.3 Definición de acciones en el algoritmo FindLargest


8.7
Refinamiento (1)
Este refinamiento necesidades algoritmo sea aceptable para la comunidad de
programadores.

Existen dos problemas.

En primer lugar, la acción en el primer paso es diferente a las de los otros pasos.

En segundo lugar, la redacción no es la misma en los pasos 2 a 5. Podemos redefinir


fácilmente el algoritmo para eliminar estos dos inconvenientes al cambiar la redacción
en los pasos 2 a 5 para “ Si el número entero actual es mayor que el más grande, más
grande fijar a la corriente entero. ”

8.8
Refinamiento (2)

La razón por la que el primer paso es diferente de los otros pasos se debe a
que más grande no se ha inicializado. Si inicializamos más grande de - ∞ ( menos
infinito), entonces el primer paso puede ser el mismo que los otros pasos, por
lo que añadir un nuevo paso, llamándolo paso 0 para demostrar que se debe
hacer antes de procesar cualquier número entero.

8.9
Figura 8.4 FindLargest refinada
8.10
Generalización
¿Es posible generalizar el algoritmo? Queremos encontrar el más grande de norte en
positivos, donde norte puede ser 1000,
1.000.000, o más.

Podemos seguir la Figura 8.4 y repetir cada paso. Pero si cambiamos el algoritmo para
un programa, entonces tenemos que escribir realmente las acciones de norte ¡pasos!

Hay una mejor manera de hacer esto. Podemos indicar al ordenador que repetir los pasos norte

A continuación se incluye esta característica en nuestro algoritmo pictórica (Figura 8.5).

8.11
Figura 8.5 Generalización de FindLargest
8.12
8-2 tres construcciones

Científicos de la computación han definido tres construcciones para un


programa estructurado o algoritmo (Figura 8.6). La idea es que un programa
debe estar hecho de una combinación de sólo estos tres constructos:

1. secuencia ,
2. La decisión ( selección)
3. repetición

8.13
Figura 8.6 tres construcciones

8.14
Secuencia
Un algoritmo, y, finalmente, un programa, es una secuencia de instrucciones, que
puede ser una simple instrucción o cualquiera de los otros dos constructos.

Decisión
Necesitamos poner a prueba una condición. Si el resultado de la prueba es verdadera,
seguimos una secuencia de instrucciones: si es falso, se sigue una secuencia diferente de
instrucciones. Esto se conoce como la decisión (selección) constructo. ( if-else )

8.15
Repetición
En algunos problemas, la misma secuencia de instrucciones se debe repetir.
Se realiza el tratamiento con la repetición o lazo
construir. Encontrar el mayor entero entre un conjunto de números enteros puede utilizar una

construcción de este tipo.

8.16
REPRESENTACIÓN 8

Durante las últimas décadas, las herramientas han sido diseñadas para
este fin. Dos de estas herramientas, UML y
pseudocódigo , Se presentan aquí.

8.17
UML
Unified Modeling Language (UML) es una revista ilustrada

representación de un algoritmo. Oculta todos los detalles de un algoritmo en


un intento de dar el “ cuadro grande ” y para mostrar cómo fluye el algoritmo
de principio a fin.

UML se trata en detalle en el Apéndice B. Aquí sólo mostramos cómo los tres
constructos se representan usando UML (Figura
8.7).

8.18
Figura 8.7 UML para tres constructos

8.19
pseudocódigo
Pseudocódigo es una representación en idioma Inglés Ahi esta hay un estándar para
pseudocódigo - algunas personas utilizan una gran cantidad de detalles, otros utilizan
menos. Algunos utilizan un código que está cerca de Inglés, mientras que otros utilizan
una sintaxis como el lenguaje de programación Pascal.

Pseudocódigo se trata en detalle en el Apéndice C. Aquí sólo mostramos cómo


los tres constructos pueden ser representados por pseudocódigo (Figura 8.8).

8.20
Figura 8.8 Pseudocódigo para tres constructos

8.21
Ejemplo 8.1

Escribir un algoritmo en pseudocódigo que encuentra la suma de dos números enteros.

8.22
Ejemplo 8.2

Escribir un algoritmo para cambiar una calificación numérica a un / no pase de grado pase.

8.23
Ejemplo 8.3

Escribir un algoritmo para cambiar una calificación numérica (número entero) a un grado de la letra.

8.24
Ejemplo 8.4

Escribir un algoritmo para encontrar el más grande de un conjunto de números enteros. No sabemos
el número de enteros.

8.25
Ejemplo 8.5

Escribir un algoritmo para encontrar el más grande de los 1000 primeros números enteros en un
conjunto de números enteros.

8.26
8

Ahora que hemos discutido el concepto de un algoritmo y se muestra su


representación, que aquí hay una definición más formal.

yo

Algoritmo:
Un conjunto ordenado de pasos inequívocos que produce una
resultar y termina en un tiempo finito.

8.27
1. bien definidos
Un algoritmo debe ser un bien definido, conjunto ordenado de instrucciones .

2. pasos inequívocos
Cada paso en un algoritmo debe estar claramente y sin ambigüedad
definido.
Si un paso es añadir dos números enteros, debemos definir dos “ enteros ” ,
“ añadir ” la operación: no podemos, por ejemplo, utilizar el mismo símbolo
para significar además en un lugar y en otro lugar la multiplicación.

8.28
3. Producir un resultado
Un algoritmo debe producir un resultado, de lo contrario es inútil. El resultado
puede ser datos devueltos al algoritmo de llamada, o algún otro efecto (por
ejemplo, impresión).

4. Terminar en un tiempo finito


Un algoritmo debe terminar (alto). Si no es así (es decir, que tiene un
bucle infinito), no hemos creado un algoritmo. En el capítulo 17
hablaremos de problemas solubles e insolubles, y vamos a ver que un
problema soluble tiene una solución en forma de un algoritmo que
termina.

8.29
8

Varios algoritmos se utilizan en la informática de manera


prevalentemente que se consideran “ BASIC ” .

Se discuten los más comunes aquí. Esta discusión es muy general:


aplicación depende del idioma.

8.30
Suma
Podemos añadir dos o tres enteros con mucha facilidad, pero ¿cómo podemos añadir muchos

números enteros? La solución es simple: utilizamos el operador complemento en un bucle

(Figura 8.9).

Un algoritmo de suma tiene tres partes lógicas:

1. Inicialización de la suma en el comienzo.

2. El bucle, que en cada iteración añade un nuevo número entero a la suma.

3. Retorno del resultado después de salir del bucle.

8.31
Figura 8.9 algoritmo de suma

8.32
Producto
Otro algoritmo común es encontrar el producto de una lista de números enteros.
La solución es simple: utilizar el operador de multiplicación en un bucle (Figura
8.10).

Un algoritmo de producto tiene tres partes lógicas:

1. Inicialización del producto desde el principio.

2. El bucle, que en cada iteración multiplica un nuevo número entero con el


producto.

3. Retorno del resultado después de salir del bucle.

8.33
Figura 8.10 algoritmo de producto

8.34
Más pequeño y más grande

La idea era escribir un constructo decisión de buscar el mayor de dos números enteros. Si

ponemos esta construcción en un bucle, podemos encontrar la mayor de una lista de números

enteros.

Encontrar el número entero más pequeño entre una lista de números enteros es similar, con

dos diferencias menores.

En primer lugar, se utiliza un constructo decisión de buscar el menor de dos números enteros .

En segundo lugar, inicializamos con un gran número entero en lugar de una muy pequeña .

8.35
Clasificación

Una de las aplicaciones más comunes en la informática es la clasificación, que es


el proceso por el cual los datos se disponen de acuerdo con sus valores.

En esta sección, introducimos tres algoritmos de ordenación:


ordenación por selección , ordenamiento de burbuja y tipo de inserción .

Estos tres algoritmos de clasificación son la base de algoritmos de ordenación más


rápidos utilizados en la informática actual.

8.36
tipo de selección

en un ordenación por selección , la lista para ser ordenados se divide en dos sublistas -
ordenados y sin clasificar - que están separados por una pared imaginaria.

Nos encontramos con la elemento más pequeño en la lista secundaria sin clasificar y
intercambiarlo con el elemento al principio de la lista secundaria sin clasificar. Después de
cada selección y de intercambio, la pared imaginaria entre los dos sublistas mueve un
elemento delante.

Figura 8.11 selección especie


8.37
Figura 8.12 Ejemplo de selección especie
8.38
Figura 8.13 algoritmo de ordenación por selección
8.39
SelectionSort función (datos de tipo [1..n]) Índice i, j,
máx
Para i de 1 a n hago max =
i
Para j desde i + 1 haga n Si los datos [j]>
data [max] entonces max = j

intercambiar datos [i] y los datos [max] Fin

8.40
tipo burbuja
En el método de ordenamiento de burbuja, la lista para ser ordenados también se divide en dos

sub - clasificados y sin clasificar.

El elemento más pequeño se burbujeaba en la lista secundaria sin clasificar y se trasladó a


la sublista ordenada. Después de que el elemento más pequeño ha sido movido a la lista
ordenada, la pared se mueve un elemento por delante.

Figura 8.14 Ordenamiento de burbuja

8.41
Figura 8.15 Ejemplo de ordenamiento de burbuja

8.42
Función BubbleSort (datos de tipo [1..n])
Índice de i, j;
Para i de N a 2 do
Para j de 1 a i - 1 hacer
Si los datos [j]> datos [j + 1] y luego
datos de Exchange [j] y los datos [j + 1] End

8.43
tipo de inserción

El algoritmo de ordenación por inserción es una de las técnicas de selección más comunes,
y que a menudo es utilizado por jugadores de cartas . Cada tarjeta de un jugador recoge se
inserta en el lugar que le corresponde en su mano de cartas para mantener una secuencia
particular.

Figura 8.16 Tipo de inserción

8.44
Figura 8.17 Ejemplo de ordenación por inserción
8.45
Función InsertionSort (datos de tipo [1..n]) Índice i, j;
valor de tipo;

Para i de 2 a n hacer valor


= datos [i]; j = i - 1;

Mientras j> = 1 y los datos [j]> valor hacer datos [j +


1] = datos [j]; j = j - 1;

datos [j + 1] = Valor; Fin

8.46
buscando

Otro algoritmo común en la informática es


buscando , Que es el proceso de encontrar la ubicación de un blanco de entre una
lista de objetos.

Hay dos búsquedas básicas para las listas: búsqueda secuencial y


búsqueda binaria .

búsqueda secuencial se puede utilizar para localizar un elemento en cualquier lista, mientras que

la búsqueda binaria requiere la lista primero en ser resuelto.

8.47
búsqueda secuencial

búsqueda secuencial se utiliza si la lista que se debe buscar es no ordenado .


Generalmente, se utiliza esta técnica sólo para pequeñas listas o listas que no se
buscan a menudo.

En una búsqueda secuencial, que empieza a buscar el objetivo desde el principio de la


lista. Continuamos hasta que nos encontremos, ya sea el objetivo o llegar al final de la
lista.

8.48
Figura 8.18 Un ejemplo de una búsqueda secuencial

8.49
Búsqueda binaria

El algoritmo de búsqueda secuencial es muy lento. Si tenemos una lista de un millón de


elementos, tenemos que hacer un millón de comparaciones en el peor de los casos. Si la
lista no está ordenada, esta es la única solución. Si la lista está ordenada, sin embargo,
podemos utilizar un algoritmo más eficiente llamada búsqueda binaria .

Una búsqueda binaria se inicia mediante pruebas de los datos en el elemento en la


mitad de la lista. Esto determina si el objetivo está en la primera mitad o la segunda
mitad de la lista. Si es en la primera mitad, no hay necesidad de comprobar aún más la
segunda mitad. Si es en la segunda mitad, no hay necesidad de comprobar además la
primera mitad. En otras palabras, eliminamos la mitad de la lista de la consideración
adicional .

8.50
Figura 8.19 Ejemplo de una búsqueda binaria

8.51
8-6 subalgoritmos

Los principios de la programación estructurada, sin embargo, requieren que un


algoritmo se divide en pequeñas unidades llamadas
subalgoritmos .

Cada subalgoritmo está a su vez dividido en subalgoritmos más pequeños.


Un buen ejemplo es el algoritmo para el tipo de selección en la Figura 8.13.

8.52
Figura 8.20 Concepto de un subalgoritmo
8.53
carta de estructura

Un diagrama de estructura es una herramienta de diseño de alto nivel que muestra la


relación entre los algoritmos y subalgoritmos.

Se utiliza principalmente en el nivel de diseño en lugar de a nivel de programación.


Se discute brevemente la carta de estructura en el Apéndice D.

8.54
8-7 RECURSION

En general, hay dos enfoques para la escritura


algoritmos para resolver un problema. uno usos iteración ,
los otros usos recursividad .

La recursividad es un proceso en el que un algoritmo llama a sí misma.

8.55
definición iterativa
Para estudiar un ejemplo sencillo, considere el cálculo de un factorial. El
factorial de un número entero es el producto de los valores integrales de 1
al número entero. La definición es iterativo (Figura 8.21). Un algoritmo es
iterativa cada vez que la definición no implica el propio algoritmo.

Figura 8.21 definición iterativa de factorial


8.56
definición recursiva
Un algoritmo se define de forma recursiva cada vez que aparece el algoritmo dentro de
la definición en sí. Por ejemplo, la función factorial puede definirse de forma recursiva
como se muestra en la Figura 8.22.

Figura 8.22 definición recursiva del factorial


8.57
Figura 8.23 Determinación de la solución recursiva al problema factorial

8.58
solución iterativa
Esta solución implica generalmente un bucle.

8.59
solución recursiva
La solución recursiva no necesita un bucle, como el propio concepto de recursividad
implica la repetición.

8.60

También podría gustarte