Está en la página 1de 12

UNIVERSIDAD DE AQUINO BOLIVIA

CARRERA DE INGENIERIA DE SISTEMAS

ALUMNO: RICARDO J. LIMACHI COAQUIRA DOCENTE: Ing. K. Estrada


MATERIA: ANALISIS DE SISTEMAS II FECHA: Agosto, 2015

TEMA 1. INTRODUCCIÓN

HISTORIA DE LA PROGRAMACIÓN.

Desde la introducción del computador digital, los programadores han estado a la


búsqueda de lenguajes de alto nivel. La raíz de la programación orientada por objetos
puede ser vistas como un intento gradual de los diseñadores de lenguajes de
programación de ayudar a construir software de manera más rápida por programadores
individuales o equipos de programadores y ayudar al mantenimiento del software después
que este se ha escrito. A finales de los 50 uno de los problemas que existía en grandes
desarrollos de programas en FORTRAN era que los nombres de las variables
presentaban conflictos en diferentes partes del programa. A consecuencia de esto los
diseñadores del lenguaje Algol deciden proveer "barreras" para separar nombres de
variables dentro de segmentos de programas. Esto da nacimiento al Begin ... End en el
bloque del Algol 60. Desde entonces los nombres de variables aparecen dentro de un
bloque de área local; el uso de ellas no dará conflicto con el uso del mismo nombre de la
variable en otro sitio del mismo programa. Por lo tanto este fué el primer intento de
proveer protección o encapsulamiento dentro de un lenguaje de programación. Las
estructuras de bloque son ahora muy usadas en una variedad de lenguajes tales como: C,
Pascal y ADA.
A final de los años 60, los diseñadores del lenguaje SIMULA 67 ( Dahl y Nygaard) toman
el concepto de "bloque" del Algol 60 para dar el primer paso hacia el concepto futuro de
"objeto".
Aunque las raíces del SIMULA fue el Algol, este fue principalmente ideado como un
lenguaje de simulación. Este fue el comienzo del uso de la encapsulación de datos dentro
de un lenguaje de programación.
A principio de los 70 el concepto de abstracción de datos fue propuesto por un número de
diseñadores de lenguaje con una orientación para manejar grandes programas. Los
lenguajes tales como Alphard (Wulf y Shaw.1976) comienzan el uso de objetos , clases y
propiedades de herencia. Al mismo tiempo, una buena parte de los fundamentos y teorías
matemáticas para tipos abstracto de datos comienzan a desarrollarse. Esto ayudó a
establecer el concepto de tipo abstracto de datos, suministrando así una rigurosidad
matemática para ser utilizada en la orientación por objeto.
Símilarmente al concepto de abstracción de datos y herencia, en los lenguajes tales como
TAXIS (Mylopoulos y Wong 1980) quién también provee un puente para el surgimiento del
concepto de herencia, el cual ha sido muy popular en inteligencia artificial basadas en
redes semánticas. A principio de los 80 estos conceptos comienzan a emerger juntos
hacia un concepto uniforme para encapsulamiento de datos.
EL OBJETO.

El objeto es la entidad en torno a la cual gira la POO. Un objeto es un ejemplar concreto


de una clase, como por ejemplo el curso de metodología de la programación es un curso
concreto dentro de todos los tipos de cursos que pueden existir. Un objeto pertenece a
una clase, por lo tanto dispondrá de los atributos (datos) y operaciones (métodos) de la
clase a la que pertenece. Un objeto responde al comportamiento definido por las
operaciones de la clase a la que pertenece. Es decir, si la clase coche dispone del atributo
color y del método arrancar, un coche concreto tendrá un color, y podrá arrancar,
exclusivamente.

Un objeto se puede ver como una "cápsula" de datos y algoritmos que trabajan sobre
esos datos. Un objeto no puede acceder directamente a sus datos (atributos). Los
atributos son sólo accesibles desde la implementación de los métodos de una clase. Un
objeto no puede "manipular" sus propios datos, para ello están los métodos de la clase de
dicho objeto: el comportamiento (métodos) de un objeto puede variar el valor (estado) de
sus datos (atributos). Por ejemplo, nunca debemos hacer lo siguiente:miCoche.color :=
'rojo'. Para esto definiremos métodos que actualicen el valor de los atributos de un objeto,
por ejemplo: miCoche.ponerColor('rojo').

En la POO, un objeto no es algo "eterno", se instancian (crean) y se destruyen. Una vez


que se haya instanciado un objeto puede recibir mensajes. Los objetos pueden
instanciarse de forma estática o de forma dinámica (recordar estos conceptos de
capítulos anteriores). Un objeto estático comienza su existencia una vez es declarado
(instanciación de objetos estáticos), sin embargo, un objeto dinámico no comienza su
existencia al ser declarado, sino al recibir un espacio de memoria (instanciación dinámica
de objetos).

LA CLASE.

Una clase es una descripción de datos y operaciones que describen el comportamiento


de cierto tipo de elementos. Por lo tanto, para que pueda haber objetos, antes deben
haberse definido las clases a las que pertenecerán dichos objetos. No tiene sentido un
objeto sin una clase, ya que el objeto tiene los atributos de la clase a la que pertenece, y
recibe mensajes correspondientes a métodos de la clase a la que pertenece.

Una clase se divide en una parte pública y en una parte privada. El nombre de la clase


debe ser único. Antes de continuar, recordar cómo era una librería (UNIT) en Pascal.
Tiene una parte donde se declaran las cabeceras de los subprogramas (ineterface) que
prodrán usarse desde los ficheros que usen la librería, y otra parte donde se implementan
dichos subprogramas (implementation).
Parte pública

Describe a qué operaciones responden los objetos de una clase (cómo se comportan los
objetos). En esta parte de la clase se declaran las cabeceras de los métodos de la clase
que podrán ser "invocados" por los objetos. Es decir, si un método se declara en la parte
pública, podrá ser "invocado" por un objeto de dicha clase, de lo contrario no podrá ser
"invocado" por un objeto. Es la parte "visible" de la clase, la interfaz de la clase.

Parte privada

Describe los datos de la clase y cómo las operaciones manipulan dichos datos. Esta parte
de la clase es donde se oculta (encapsula) la información de la clase: datos e
implementación de métodos declarados o no en la parte pública de la clase. Es una parte
"no visible", cada objeto de una determinada clase tiene sus atributos (datos) y sus
métodos.

LA ABSTRACCIÓN.

Podríamos definir la abstracción como la "acción de aislar mentalmente o considerar por


separado las cualidades de un objeto, considerar un objeto en su esencia". ¿Qué quiere
decir esta definición? A través de la abstracción conseguimos extraer las cualidades
principales sin detenernos en los detalles. Conseguimos a partir de un tema
determinado, generalizar y obtener una visión global del tema. Cuando montamos un
ordenador ensamblamos los componentes necesarios para construir el ordenador.
Utilizamos una placa base, un disco duro, memoria, etc. Manejamos estos dispositivos a
un nivel funcional. Es decir, abstraemos las funciones de cada dispositivo para trabajar
con ellos. En ningún momento nos paramos a pensar cómo funcionan internamente o de
cuántos condensadores y transistores está compuesto.

La abstracción es una herramienta muy potente en programación, pues reduce


considerablemente el trabajo de implementación y aumenta la portabilidad del código. La
programación orientada a objetos aporta elementos para abstraer el problema en dos
sentidos:

 Por un lado nos permite referirnos a objetos para representar la


realidad,describiendo el problema en términos del problema en lugar de en
términos de la solución. En un programa de gestión comercial, tendremos el
objeto cliente o el objeto factura, que no son más que representaciones de otros
objetos en el espacio del problema.
 La clave de la programación orientada a objetos está en abstraer los métodos y los
datos comunes a un conjunto de objetos y agruparlos en una clase. Gracias a este
nivel de abstracción, añadir o eliminar un objeto nuevo supondrá muy poco
esfuerzo.
HERENCIA.

La herencia es un mecanismo exigido a cualquier lenguaje que pretenda ser orientado a


objetos. Consideraremos la herencia como la transmisión de los métodos y atributos de
una clase a otra. Gracias a la herencia se pueden establecer jerarquías entre clases.
Establecer una jerarquía es un proceso subjetivo, que depende del programador y de los
matices de apreciación de cada uno.

La herencia nos permite definir una jerarquía en la que existirán clases padre y clases


hijo, pudiéndo ser una clase padre de otra clase, e hijo de otra clase a la vez. No deben
definirse jerarquías de herencia en la que una clase sea padre e hijo de la misma clase.
Existen 2 tipos de herencia: La herencia simple y la herencia múltiple. En la herencia
simple una clase sólo puede tener una clase padre, en la herencia múltiple, una clase
puede tener más de una clase padre

POLIMORFISMO.

Esta característica permite definir distintos comportamientos para un método dependiendo


de la clase sobre la que se realize la implementación. En todo momento tenemos un único
medio de acceso, sin embargo se podrá acceder a métodos distintos.

Veamos el siguiente ejemplo, en el que se define una clase forma de la que se heredan
las clases círculo y cuadrado.

La clase forma define los métodos dibujar y borrar. En la definición de estos métodos se
implementará el código común a todos los objetos de la clase. Sin embargo cuando
definamos las clases hijas, círculo y cuadrado, será necesario modificar estos métodos
para adaptarlos a las nuevas subclases. El método de la clase padre implementa aquellas
acciones comunes. Las clases hijas añaden las operaciones particulares que necesiten.
Cuando utilicemos los métodos de la clase forma no tendremos que hacer distinción entre
cuadrados y círculos. Gracias al polimorfismo se ejecutará el método adecuado en función
de la subclase a la que pertenezca el objeto.

En la declaración de una clase estamos definiendo el conjunto de métodos y campos que


son accesibles desde fuera de una clase o lo que a menudo se denomina contratode la
clase. Este contrato determina cual va a ser la funcionalidad de la clase. Pero cuando
extendemos una clase para crear otra estamos ampliando este contrato añadiendo mas
funcionalidades. Por tanto cuando creamos esa nueva clase hacemos uso de dos
mecanismos. Por un lado la herencia para reutilizar las partes comunes de la super-
clase. Y por otro el polimorfismo, es decir el cambio en la forma en la que se implementa
el contrato de la superclase. Como vemos al escribir una subclase podemos sobreescribir
el contrato añadiendo nuevas funcionalidades, pero no cambiarlo.

VENTAJAS DE LA PROGRAMACIÓN ORIENTADA A OBJETOS.

Vamos a ver las ventajas más importantes de la programación orientada a objetos:

 Reusabilidad. Cuando hemos diseñado adecuadamente las clases, se pueden


usar en distintas partes del programa y en numerosos proyectos.
 Mantenibilidad. Debido a las sencillez para abstraer el problema, los programas
orientados a objetos son más sencillos de leer y comprender, pues nos permiten
ocultar detalles de implementación dejando visibles sólo aquellos detalles más
relevantes.
 Modificabilidad. La facilidad de añadir, suprimir o modificar nuevos objetos nos
permite hacer modificaciones de una forma muy sencilla.
 Fiabilidad. Al dividir el problema en partes más pequeñas podemos probarlas de
manera independiente y aislar mucho más fácilmente los posibles errores que
puedan surgir.

La programación orientada a objetos presenta también algunas desventajas como pueden


ser:

 Cambio en la forma de pensar de la programación tradicional a la orientada a


objetos.
 La ejecución de programas orientados a objetos es más lenta.
 La necesidad de utilizar bibliotecas de clases obliga a su aprendizaje y
entrenamiento.

LENGUAJES ORIENTADOS A OBJETOS.

Simula (1967) es aceptado como el primer lenguaje que posee las características
principales de un lenguaje orientado a objetos. Fue creado para hacer programas de
simulación, en donde los "objetos" son la representación de la información más
importante. Smalltalk (1972 a 1980) es posiblemente el ejemplo canónico, y con el que
gran parte de la teoría de la programación orientada a objetos se ha desarrollado.

Entre los lenguajes orientados a objetos se destacan los siguientes:

ABAP Lexico (en castellano)


ABL Lenguaje de programación de Objective-C
OpenEdge de Progress Software
ActionScript Ocaml
ActionScript 3 Oz
Ada R
C++ Python
C# PHP (a partir de su versión 5)
Clarion PowerBuilder
Clipper (lenguaje de Perl (soporta herencia múltiple. La
programación) (Versión 5.x con librería de resolución se realiza en preorden, pero
objetos Class(y)) puede modificarse al algoritmo linearization
C3 por medio del
módulo Class::C3 en CPAN)
D Ruby
Object Pascal (Delphi) Visual Basic 6.0
Gambas Magik (SmallWorld)
Harbour Vala
Eiffel VB.NET
Java Visual FoxPro (en su versión 6)
JavaScript (la herencia se realiza por Smalltalk (Proyecto investigativo. Influenció
medio de la programación basada en a Java.)
prototipos)
Visual Objects XBase++
Lenguaje DRP Lenguaje de programación
Scala (lenguaje usado por Twitter)

Muchos de estos lenguajes de programación no son puramente orientados a objetos, sino


que son híbridos que combinan la POO con otros paradigmas.

Al igual que C++ otros lenguajes, como OOCOBOL, OOLISP, OOPROLOG y Object


REXX, han sido creados añadiendo extensiones orientadas a objetos a un lenguaje de
programación clásico.

Un nuevo paso en la abstracción de paradigmas de programación es la Programación


Orientada a Aspectos (POA). Aunque es todavía una metodología en estado de
maduración, cada vez atrae a más investigadores e incluso proyectos comerciales en todo
el mundo.

ENCAPSULAMIENTO.

Imaginemos que se crea una clase, una docena de programadores tienen acceso a dicha
clase y la utilizan a discreción, posteriormente dicha clase comienza a comportarse de
una manera inesperada debido a que los valores que algunas variables han tomado no
fueron anticipados y todo comienza a desmoronarse. Para corregir el problema se crea
una versión más nueva de dicha clase y listo. 

Bueno, a esto le llamamos flexibilidad y capacidad de mantenimiento, ambas son


características y beneficios de la programación Orientada a Objetos (OO) pero para que
una clase pueda cumplir dichas funciones los programadores debemos de hacer algo.
Imaginemos que creamos una clase con variables de instancia públicas a las cuales
podemos acceder sin problemas desde fuera de la misma clase...
Analizando el código anterior podemos darnos cuenta de que las variables enteras tipo y
clase son públicas y pueden ser accedidas directamente a través de una instancia de la
clase MiClase, esto compila sin ningún problema, digamos que es 'legal', sin embargo,
¿qué pasa si ingresamos un valor que no se supone debe de tener una variable (en este
caso el -5 que le asignamos a tipo)?, simplemente no hay nada que nos detenga para
hacerlo. La única manera de proteger el código es escribiendo un método que nos permita
regular los valores que cada variable puede tener y escondiendo las variables para que no
se pueda acceder a ellas de manera directa, esto es el principio básico de
encapsulamiento. 

FLUJOS DE CONTROL.

Un programa java está compuesto por una serie de sentencias. Las dos sentencias
básicas en el lenguaje Java se reflejan en la siguiente tabla:

sentencias de que son las que hemos estudiado para declarar variables y
declaración constantes.
 Expresión de asignación, a = b+c;
 Formas prefijas o posfijas de ++ y --, contador++;
 Llamadas a métodos, Objeto1.mimetodo();
sentencias de expresión
 Expresiones de creación de objetos
 Sentencias de control

Estas últimas son las que controlan el flujo de ejecución del programa. Normalmente el
orden de ejecución de sentencias es el mismo en el que están escritas. Sin embargo, las
sentencias de control de flujo introducen bifurcaciones en la ejecución del programa.

DECLARACIÓN DE UNA CLASE.

Vimos como los elementos principales de una clase son sus atributos (datos) y sus
métodos (código para manipular los datos). Veamos una clase simple, Publicacion que
podríamos utilizar para almacenar los datos sobre nuestra colección bibliográfica:
El nombre de la clase, Publicacion debe ser un identificador válido en Java y por
convención, empieza por letra mayúscula. Una declaración de clase crea un nombre de
tipo en Java. De esta forma las referencias a objetos Publicacion se pueden declarar con
un simple:

Las variables de una clase se llaman campos. La clase Publicacion tiene tres campos,
idPublicacion que identifica de forma unívoca cada publicación, titulo que es el título de la
publicación y autor que ha firmado la publicación.

Podríamos definir un campo propietario. Con este campo indicaríamos el propietario del
libro. Sería útil, si sólo vamos a almacenar nuestras publicaciones, que el valor de este
campo lo compartan todas los objetos que podamos definir a partir de esta clase.
Calificaríamos la declaración de este campo con la palabra reservada static:

CONTROL DE ACCESO A LOS MIEMBROS DE UNA CLASE.

Cuando se definió la clase Publicacion, el campo idPublicacion se pensó para que se


generase de forma automática y de forma coherente. Por tanto cualquier modificación
externa sobre este campo podría dejar al objeto en un estado inconsistente, y podríamos
tener dos objetos con el mismo identificador. Queremos por tanto que este campo sólo se
pueda leer y no pueda ser modificado por ningún otro objeto. Para ello se "oculta" este
campo y se proporciona un método público para poder acceder a su valor:
¿Qué hemos conseguido? Ahora para acceder al valor del campo idPublicacion será
necesario utilizar el método id. Y la única forma de modificar este campo será por medio
de métodos internos a la clase Publicacion .

Estos mecanismos que regulan el acceso se denominan métodos de acceso y se


resumen en la siguiente tabla:

Método Descripción
private Un miembro privado es accesible sólo para la clase en la que está definido.
La propia clase, las subclases y todas las clases dentro del mismo paquete
protected
tienen acceso a los miembros calificados con este método de acceso.
public Todas las clases tienen acceso a los miembros públicos de la clase.
package Sólo las clases del mismo paquete que la clase tienen acceso a los miembros

En los constructores de las clases, se pueden utilizar especificadores de acceso para


indicar que objetos pueden crear ejemplares de su clase: private si ninguna clase puede
crear un objeto de su clase, sólo se podrá crear por medio de métodos públicos de la
clase, protected cuando sólo las subclases pueden crear objetos, public si cualquiera
puede crear objetos de esta clase y package-access cuando sólo desde los objetos
pertenecientes al mismo paquete se pueden crear objetos de esa clase

ESTRUCTURA DE DATOS.

PILAS.

La pila es una secuencia de elementos del mismo tipo en la que el acceso a la misma se
realiza por un único lugar denominado cima:

Vemos como el acceso a los elementos de la pila se realiza siempre sobre un único
extremo. Las operaciones que caracterizan la pila son las de introducir un nuevo elemento
sobre la cima (push) y la de extraer el elemento situado en la cima (pop). Una forma de
ver esta estructura de datos es como una pila de libros en la que sólo se puede coger el
libro que está en la cima o apilar más libros sobre la misma, pero los libros que sostienen
la pila no son accesibles pues de otro modo todo se desmoronaría.

El interfaz en Java que define esta clase de objetos y sus métodos son los siguientes:

Pila.java

LISTAS.
Una lista es una secuencia de elementos dispuesto en un cierto orden, en la que cada
elemento tiene como mucho un predecesor y un sucesor. El número de elementos de la
lista no suele estar fijado, ni suele estar limitado por anticipado. Representaremos la
estructura de datos de forma gráfica con cajas y flechas. Las cajas son los elementos y
las flechas simbolizan el orden de los elementos.

La estructura de datos deberá permitirnos determinar cuál es el primer elemento y el


último de la estructura, cuál es su predecesor y su sucesor (si existen de cualquier
elemento dado). Cada uno de los elementos de información suele denominarse nodo.

La lista también puede representarse de forma simbólica escribiendo sus elementos


separados por comas y encerrados entre corchetes. Por ejemplo:

["rojo","verde","azul","amarillo"]

Las listas admiten ciertas operaciones como son insertar un nodo adicional, borrar un
nodo, etc. En función de la forma de insertar nuevos elementos y acceder a los existente
tendremos distintos tipos de listas. Veamos ahora qué operaciones básicas se puedes
realizar sobre las listas. Se tratarán aquí las operaciones que permiten insertar y borrar
elementos únicamente al principio de la misma, por lo que las operaciones de acceso,
inserción y supresión de elementos en cualquier posición de la lista no se consideran
básicas pero podrán ser tratadas mediante recursión.

Las operaciones básicas sobre una lista son:

 EsVacia Averiguar si la lista esta vacía.


 Insertar Añade un elemento al principio de la lista.
 Primero Obtener el valor del primer elemento de la lista, también llamado cabeza.
 Resto Devuelve el trozo de lista resultado de eliminar el primer elemento de la
lista.
 Borrar Borrar el primer elemento de la lista.

COLAS.

Los elementos de la cola se añaden y se eliminan de tal manera que el primero en entrar
es el primero en salir. La adición de elementos se realiza a través de una operación
llamada encolar (enqueue), mientras que la eliminación se denomina desencolar
(dequeue). La operación de encolar inserta elementos por un extremo de la cola,
mientras que la de desencolar los elimina por el otro.

El siguiente interfaz muestras las operaciones típicas para colas:

Cola.java
ÁRBOLES.

La estructura de datos árbol al contrario que las listas es una estructura de datos no


lineal. Las listas tienen un orden impuesto en sus elementos teniendo como mucho un
predecesor y un sucesor. Los árboles pueden tener dos o más sucesores.

Un árbol consiste en un conjunto de nodos o vértices y un conjunto


de aristas oarcos que satisface unos requisitos:

 Existe una jerarquía de nodos, de forma que a cada nodo hijo le llega una arista
de otro nodo padre. De esta forma se establece la relación padre-hijo: p es padre
de h, h es un hijo de p.
 El nodo donde comienza la jerarquía se llama nodo raíz. A este nodo no llegan
arcos de ningún otro nodo, en otras palabras, no es hijo de ningún nodo padre.
 Existe un camino único entre la raíz y cualquiera de los nodos del árbol

EXPLORACIÓN DE ÁRBOLES.

Los árboles son estructuras de datos usadas cuando se quieren manejar rápidamente
gran cantidad de datos. A menudo querremos realizar operaciones sobre los nodos del
árbol para lo que necesitaremos explorarlo. A pesar de la variedad de algoritmos, en
todos ellos deberemos visitar todos los nodos o lo que es lo mismo recorrer el árbol.

Existen dos formas principales para recorrer un árbol:

 Profundidad, que engloba recorridos que se realizarán de forma recursiva.


 Anchura que seguirá la estructura de niveles del árbol.

Existen tres formas de recorrer un árbol en profundidad:

 Preorden. El tratamiento de la raíz se realiza primero y luego el de los hijos,


siendo el orden de recorrido raiz, hijoIzquierdo, hijoDerecho
 Inorden. El tratamiento de la raíz se realiza entre el de los subárboles. El orden
del recorrido será hijoIzquierdo, raíz, hijoDerecho
 Postorden. Se realiza el tratamiento de los hijos y se deja para el final el de la raíz
quedando un orden de recorrido hijoIzquierdo, hijoDerecho, raíz
GRAFOS.

Desde un punto de vista intuitivo un grafo es un conjunto de nodos unidos por un conjunto
de arcos. Un ejemplo de grafo que podemos encontrar en la vida real es el de un plano de
trenes. El plano de trenes está compuesto por varias estaciones (nodos) y los recorridos
entre las estaciones (arcos) constituyen las líneas del trazado.

Veremos a continuación una definición más formal de grafos. Un grafo G=(V,E) consiste


en un conjunto V de nodos (vértices) y un conjunto E de aristas (arcos). Cada arista es
un par (v,w), siendo v y w un par de nodos pertenecientes al conjunto V de nodos.
Podemos distinguir entre grafos dirigidos y no dirigidos. En un grafo dirigido los pares
(v,w) están ordenados, traduciéndose la arista en una flecha que va desde el nodo v al
nodo w.

ALGORITMOS VORACES.

Tal y como indica su nombre estos algoritmos intentan buscar la solución desde el primer
momento. El enfoque que utilizan es ir construyendo la solución en cada paso.

Este tipo de algoritmos es muy empleado en los llamados problemas de optimización. Son
problemas que a partir de una colección de elementos tratan de obtener un subconjunto
de los mismo que optimice la consecución del objetivo. En algunos caso se trata de
obtener un orden entre los elementos de entrada con el fin de optimizar una medida.
Ejemplos de este tipo de problemas donde aplicar esta técnica son:

 Tenemos un ascensor capaz de transportar un máximo de kilos k y tenemos un


grupo de personas cuyos pesos suman más de la capacidad del ascensor. El
problema sería llenar el ascensor con el máximo número de pasajeros sin
sobrepasar su capacidad
 ¿Cómo podemos grabar una cinta de música de manera que el orden de
grabación nos permita minimizar el tiempo de acceso a las canciones?

El esquema que va a seguir la técnica voraz es ir construyendo una solución parcial y


evaluando qué elemento de entre el conjunto de candidatos añadir en el siguiente paso.
Para ello se ayudará de una función de selección que en el caso del ascensor podría
ser tan sencilla como "escoger el más ligero". Esta función ha de diseñarse de forma que
garantice la obtención de la solución óptima, sin prejuicio de que existan más de una. Los
algoritmos voraces nunca rectifican: una vez que un elemento de la entrada ha pasado a
formar parte de la solución, permanece como integrante de ésta hasta que el algoritmo
termina.

También podría gustarte