Download NetC.Time s - upcAnalisisAlgoritmos

Document related concepts
no text concepts found
Transcript
Parcial
02
Historia
04/10/10
II Parcial Analisis de
. Algoritmos
NetC .Time
s
Metodo Shell Sort •
Tito Agudelo • Pedro Fula • Yesid Gutierrez • Oscar M unevar
El ordenamiento Shell (Shell sort en inglés) es un algoritmo de
ordenamiento. El método se denomina Shell en honor de su
inventor Donald Shell. Su implementación original, requiere O(n2)
comparaciones e intercambios en el peor caso. Un cambio menor
presentado en el libro de V. Pratt produce una implementación con
un rendimiento de O(nlog2 n) en el peor caso. Esto es mejor que las
O(n2) comparaciones requeridas por algoritmos simples pero peor
que el óptimo O(n log n). Aunque es fácil desarrollar un sentido
intuitivo de cómo funciona este algoritmo, es muy difícil analizar su
tiempo de ejecución.
Docente: Diana Mabel Diaz H. I n g e n i e r í a d e S i s t e m a s
Universida
d P i l o t o d e
C o l o m b i a
Tito Arturo Agudelo Flórez
Pedro Antonio Fula Perilla
Oscar Fernando Munevar
Yesid Fernando Gutierrez
Análisis de Algortimos El Shell sort es una generalización del ordenamiento por inserción,
teniendo en cuenta dos observaciones:
1. El ordenamiento por inserción es eficiente si la entrada
está "casi ordenada".
2. El ordenamiento por inserción es ineficiente, en general,
porque mueve los valores sólo una posición cada vez.
El algoritmo Shell sort mejora el ordenamiento por inserción
comparando elementos separados por un espacio de varias
posiciones. Esto permite que un elemento haga "pasos más
Parcial Número 02 Octubre 04 de 2010.
grandes" hacia su posición esperada. Los pasos múltiples sobre los
datos se hacen con tamaños de espacio cada vez más pequeños. El
último paso del Shell sort es un simple ordenamiento por inserción,
pero para entonces, ya está garantizado que los datos del vector
están casi ordenados.
Parcial II
Análisis de Algortimos CORRECTITUD Valores iníciales y estado inicial
public String Shell() {
long despues = 0;
long antes = System.currentTimeMillis();
int salto, cambios, aux, i;
for (salto = vector.length / 2; salto != 0; salto /= 2)
{
for (cambios = 1; cambios != 0;) {
cambios = 0;
for (i = salto; i < vector.length; i++)
Parcial Número 02 Octubre 04 de 2010.
if (vector[i - salto] > vector[i]) {
aux = vector[i];
vector[i] = vector[i - salto];
vector[i - salto] = aux;
cambios++;
}
}
}
despues = System.currentTimeMillis();
double x = (despues - antes) / 10;
System.out.println(x);
return "El tiempo de ordenacion para el metodo Shell con un vector "
+ vector.length + " fue de " + x + " microSeg ";
}
Parcial II
Análisis de Algortimos Inicio
Se crea un vector de tamaño n.
Se inicializa las variables –después- y –antes- para tomar los tiempos que se tarde el algoritmo con
diferentes cantidades de números.
Antes = System.currentTimeMillis ();  se inicia el tiempo de partida del algoritmo
Después =0;
 prerrequisito.
Después = System.currentTimeMillis ();  se inicia un tiempo apartar de que el algoritmo termina.
Antes > 0;  prerrequisito.
X= (después – antes) /100  se halla el resultado del tiempo que tarda en ejecutarse el algoritmo.
Se inicializa salto tomando el tamaño del vector dividido en 2 para empezar con el algoritmo
Parcial Número 02 Octubre 04 de 2010.
Salto = vector.length / 2;
Salto != 0;  prerrequisito para que empiece el algoritmo
Mantenimiento
Salto = vector.length / 2;

siempre está tomando el tamaño del vector dividido
en 2 para organizarlo.
Aux = vector[i];

depende del valor que tenga i.
Finalización
Vector[n]
 vector de tamaño n ordenado.
Parcial II
Análisis de Algortimos X = (antes – después)/100 tiempo de finalización del algoritmo
Parcial Número 02 Octubre 04 de 2010.
Algoritmo
Clase VectorArreglo
1. Método Principal
a. Declaraciones
Vector = vector []
antes = long : Real(System.currentTimeMillis())
después = 0 long : Real
salto = 0: Real
aux = 0: Real
cambios = 0: Real
i = 0: Real
x = doublé
lenght = Vector [n]
b. Ciclo para leer tamaño del archivo (vector)
Inicialice salto = vector.length/2;
Compare si salto ¡= 0;
Salto /= 2
c. Ciclo para leer cambio
Inicialice cambio = 1;
Si cambios ¡= 0;
Asigne cambio = 0;
d. Ciclo para leer i (vector)
Inicialice i = salto;
Compare i < vector.length
Incremente i++
e. Compare si (vector[i - salto] > vector[i])
Asigne aux = vector[i];
Asigne Vector[i] = vector[i - salto];
vector[i - salto] = aux;
Incremente cambio++
Complejidad
orden 1
orden 1
orden 1
orden 1
orden 1
orden 1
orden 1
orden 1
orden 1
orden 1
orden 1
orden n
orden k
orden k*n
orden 1
orden n
orden n
orden 1
orden 1
orden n
orden k
orden k
orden k*n
orden n
orden k
orden k
orden k
orden k
orden n
Parcial II
Análisis de Algortimos Parcial Número 02 Octubre 04 de 2010.
f. fin ciclo si
g. fin ciclo para
h. fin ciclo para
i. Operación
x = (después – antes / 10)
g. Imprima x
h. Return
“El tiempo de ordenación para el método
Shell con un vector” + vector.length +
“fue de un tiempo” + x + “microsegundos”;
Fin ciclo
Fin Método Principal
Fin Clase VectorArreglo
Fin
orden 1
orden 1
orden 1
orden k*n
orden k*n
orden 1
orden 1
orden 1
orden 1
orden 1
Parcial II
Análisis de Algortimos Determinando el nivel de complejidad del algoritmo Shell Sort es de O (n^2)
Se concluyo lo siguiente:
Mejor caso tiempo de 1 segundo para un vector de 140000 según el orden de complejidad.
1 = C * (140000^2)
C = 5,10 x 10^-11
Parcial Número 02 Octubre 04 de 2010.
Peor caso tiempo de 2 segundos para un vector 140000 según el orden de complejidad.
2 = C * (140000^2)
C= 1 x 10^-10
Donde C es la constante multiplicativa.
Parcial II
Análisis de Algortimos package Analisis;
import
import
import
import
import
import
import
import
java.awt.GridLayout;
java.awt.event.ActionEvent;
java.awt.event.ActionListener;
javax.swing.ImageIcon;
javax.swing.JButton;
javax.swing.JPanel;
javax.swing.JToolBar;
javax.swing.border.TitledBorder;
Clase Barra Botones
Parcial Número 02 Octubre 04 de 2010.
public class BarraBotones extends JPanel implements
ActionListener {
private JButton btnCrear;
private JButton btnShell;
private JButton btnAbout;
private InterfazPrincipal interfaz;
public static final String NUEVO = "Crear";
public static final String SHELL = "Shell";
public static final String ABOUT = "About";
private JToolBar tbBar;
public BarraBotones(InterfazPrincipal interfaz) {
this.interfaz = interfaz;
setLayout(new GridLayout(1, 9));
setBorder(new TitledBorder("Metodos de Ordenacion"));
Parcial II
Análisis de Algortimos btnCrear = new JButton();
btnCrear.setIcon(new ImageIcon("./icons/Nuevo.png"));
btnCrear.setToolTipText("Nuevo Arreglo");
btnCrear.addActionListener(this);
btnCrear.setActionCommand(NUEVO);
btnShell = new JButton();
btnShell.setIcon(new ImageIcon("./icons/Shell.png"));
btnShell.setToolTipText("Metodo Shell");
btnShell.addActionListener(this);
btnShell.setActionCommand(SHELL);
btnAbout = new JButton();
btnAbout.setIcon(new ImageIcon("./icons/About.png"));
btnAbout.setToolTipText("About");
btnAbout.addActionListener(this);
btnAbout.setActionCommand(ABOUT);
tbBar = new JToolBar();
Parcial Número 02 Octubre 04 de 2010.
tbBar.add(btnCrear);
tbBar.add(btnShell);
tbBar.add(btnAbout);
add(tbBar);
}
public void actionPerformed(ActionEvent ae) {
String comando = ae.getActionCommand();
if (comando.equals("Crear")) {
interfaz.inicializarVector();
}
else if (comando.equals("Shell")) {
interfaz.Shell();
}
else if (comando.equals("About")) {
interfaz.About();
}
Parcial II
Análisis de Algortimos }
}
package Analisis;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class InterfazPrincipal extends JFrame {
private
private
private
private
BarraBotones botones;
PanelLista lista;
PanelTiempo listat;
VectorArreglo vector;
public static void main(String[] arg) {
Clase Interfaz Principal
Parcial Número 02 Octubre 04 de 2010.
InterfazPrincipal interfaz = new InterfazPrincipal();
interfaz.setVisible(true);
}
public InterfazPrincipal() {
setTitle("Parcial Analisis de Algoritmos");
getContentPane().setLayout(new BorderLayout());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
vector = new VectorArreglo();
botones = new BarraBotones(this);
lista = new PanelLista();
listat = new PanelTiempo();
getContentPane().add(botones, BorderLayout.NORTH);
getContentPane().add(lista, BorderLayout.CENTER);
Parcial II
Análisis de Algortimos getContentPane().add(listat, BorderLayout.WEST);
pack();
}
public void inicializarVector() {
int numero = 0;
numero =
Integer.parseInt(JOptionPane.showInputDialog(this,
"Por favor ingrese el tamano del vector",
"Parcial Analisis",
JOptionPane.QUESTION_MESSAGE));
vector.Inicializar(numero);
lista.cambiarLista(vector.getVector());
}
Parcial Número 02 Octubre 04 de 2010.
public void Limpiar() {
lista.cambiarLista(vector.getVector());
}
public void Shell() {
listat.tiempos(vector.Shell());
Limpiar();
}
public VectorArreglo getVector() {
return vector;
}
public void About() {
JOptionPane.showMessageDialog(this, "Parcial
Analisis de Algoritmos"
+ "\nTito Agudelo" + "\nYesid Gutierrez" +
"\nOscar Munevar"
+ "\nPedro Fula", "About",
JOptionPane.INFORMATION_MESSAGE);
Parcial II
Análisis de Algortimos }
}
package Analisis;
import
import
import
import
import
import
import
import
import
java.awt.Color;
java.awt.Dimension;
java.awt.Font;
java.awt.GridLayout;
java.util.ArrayList;
javax.swing.JList;
javax.swing.JPanel;
javax.swing.JScrollPane;
javax.swing.border.TitledBorder;
public class PanelLista extends JPanel {
public PanelLista() {
Clase Panel Lista
Parcial Número 02 Octubre 04 de 2010.
private JList lista;
private InterfazPrincipal interfaz;
setLayout(new GridLayout(1, 1));
setBorder(new TitledBorder("Vectores"));
setPreferredSize(new Dimension(350, 350));
lista = new JList();
JScrollPane barra = new JScrollPane(lista);
lista.setBackground(new Color(230, 230, 230));
lista.setFont(new Font("Goudy Old Style", 1, 14));
lista.setForeground(new java.awt.Color(120, 120,
255));
add(barra);
}
public void cambiarLista(ArrayList vector) {
lista.setListData(vector.toArray());
Parcial II
Análisis de Algortimos }
}
package Analisis;
import
import
import
import
import
import
import
import
java.awt.Color;
java.awt.Dimension;
java.awt.Font;
java.awt.GridLayout;
javax.swing.JPanel;
javax.swing.JScrollPane;
javax.swing.JTextArea;
javax.swing.border.TitledBorder;
public class PanelTiempo extends JPanel {
private JTextArea tiempo;
setLayout(new GridLayout(1, 12));
setBorder(new TitledBorder("Tiempo de
Ordenacion"));
setPreferredSize(new Dimension(350, 350));
Clase Panel Tiempo
Parcial Número 02 Octubre 04 de 2010.
public PanelTiempo() {
tiempo = new JTextArea();
JScrollPane Barra = new JScrollPane(tiempo);
tiempo.setBackground(new Color(230, 230, 230));
tiempo.setFont(new Font("Goudy Old Style", 1, 14));
tiempo.setForeground(new java.awt.Color(120, 120,
255));
add(Barra);
}
public void tiempos(String tiempov) {
tiempo.append(tiempov + "\n");
Parcial II
Análisis de Algortimos }
}
package Analisis;
import java.util.ArrayList;
public class VectorArreglo {
private int vector[];
public VectorArreglo() {
Clase Vector Arreglo
Parcial Número 02 Octubre 04 de 2010.
}
public void Inicializar(int tamanoVector) {
vector = new int[tamanoVector];
int a = tamanoVector;
for (int i = 0; i < tamanoVector; i++) {
// vector[i] = a--;
vector[i] = (int) (Math.random() * 500000 +
1);
// vector[i]= i;
}
}
public ArrayList getVector() {
ArrayList lista = new ArrayList();
for (int i = 0; i < vector.length; i++) {
lista.add("" + (i + 1) + ") " + vector[i]);
}
return lista;
}
public String Shell() {
Parcial II
Análisis de Algortimos long despues = 0;
long antes = System.currentTimeMillis();
int salto, cambios, aux, i;
for (salto = vector.length / 2; salto != 0; salto /= 2)
{
for (cambios = 1; cambios != 0;) {
cambios = 0;
for (i = salto; i < vector.length; i++)
Parcial Número 02 Octubre 04 de 2010.
if (vector[i - salto] > vector[i]) {
aux = vector[i];
vector[i] = vector[i - salto];
vector[i - salto] = aux;
cambios++;
}
}
}
despues = System.currentTimeMillis();
double x = (despues - antes) / 10;
System.out.println(x);
return "El tiempo de ordenacion para el metodo Shell con
un vector "
+ vector.length + " fue de " + x + " microSeg
";
}
public int tamanoVector() {
return vector.length;
}
}
Parcial II
Análisis de Algortimos Parcial Número 02 Octubre 04 de 2010.
1. Ejecucion del programa, tenemos 3 iconos, primero crear nuevo vector, segundo Metodo Shell y el tercero Integrantes. 2. Escirbir Vector en este caso 140000 Parcial II
Análisis de Algortimos Parcial Número 02 Octubre 04 de 2010.
3. Nos genera 140000 numeros aleatorios, estos se pueden repetir 4. Le damos en metodo Shell y asi los ordena, como se pude ver tardo 8 mili segundos para un caso intermedio (Números Desordenados). Parcial II
Análisis de Algortimos Parcial Número 02 Octubre 04 de 2010.
5. Para el peor de los casos (Numeros invertidos) con un vector de 140000 6. Para el mejor de los casos (Numeros Ordenados) con un vector de 140000 el tiempo fue de 1 mili segundo. Parcial II
Análisis de Algortimos . REFERENCIAS BIBLIOGRÁFICAS . http://es.wikipedia.org/wiki/Ordenamiento_Shell
Mark Allen Weiss, Data Structures and Algorithm Analysis,
Benjamin/Cummings, 2a ed., 1995, pág. 216-220.
•Micha Hofri, Analysis of Algorithms: Computational Methods and
Mathematical Tools, Oxford University Press, 1995, pág. 431-437.
Parcial Número 02 Octubre 04 de 2010.
•Robert Sedgewick, Algorithms in C++, Addison-Wesley, 1992,
pág. 107-112.
•Sara Baase, Computer Algorithms: Introduction to Design and
Analysis, Addison-Wesley, 1978, pág.
Parcial II