sábado, 10 de diciembre de 2011

Shellsort...

Ejemplo de la maestra:

package equipo;
public class ShellSort
{
private long[] data;
private int len;
public ShellSort(int max) {
data = new long[max];
len = 0;
}
public void insert(long value)
{
data[len] = value;
len++;
}
public void display()
{
System.out.print("Datos:");
for (int j = 0; j < len; j++)
System.out.print(data[j] + " ");
System.out.println("");
}
public void shellSort()
{
int inner, outer;
long temp;
//find initial value of h
int h = 1;
while (h <= len / 3)
h = h * 3 + 1; // (1, 4, 13, 40, 121, ...)
while (h > 0) // decreasing h, until h=1
{
// h-sort the file
for (outer = h; outer < len; outer++)
{
temp = data[outer];
inner = outer;
// one subpass (eg 0, 4, 8)
while (inner > h - 1 && data[inner - h] >= temp)
{
data[inner] = data[inner - h];
inner -= h;
}
data[inner] = temp;
}
h = (h - 1) / 3; // decrease h
}
}
public static void main(String[] args)
{
int maxSize = 10;
ShellSort arr = new ShellSort(maxSize);
for (int j = 0; j < maxSize; j++)
{
long n = (int) (java.lang.Math.random() * 99);
arr.insert(n);
}
System.out.println("Datos no Ordenados");
arr.display();
arr.shellSort();
arr.display();
}
}


Es un algoritmo de ordenación interna muy sencillo pero muy ingenioso, basado en comparaciones e intercambios, y con unos resultados radicalmente mejores que los que se pueden obtener con el método de la burbuja, el de selección directa o el de inserción directa.

Aunque a menudo, es un algoritmo un tanto olvidado por dos motivos: en primer lugar, en los cursos básicos de programación se suele pasar por alto o se pasa "de puntillas" por este algoritmo, dado que su comprensión requiere un cierto esfuerzo y algo de tiempo, y se suele centrar la atención en los tres algoritmos más básicos (burbuja, selección e inserción); y en segundo lugar, el algoritmo QuickSort, desarrollado por Hoare en 1962 puede dar mejores resultados aún que éste, con lo cual, le suele hacer bastante sombra en los temarios de los cursos de programación básicos.

Sin embargo, es necesario romper una lanza a favor del algoritmo ShellSort, ya que es el mejor algoritmo de ordenación in-situ... es decir, el mejor de aquellos en los que la cantidad de memoria adicional que necesita -aparte de los propios datos a ordenar, claro está- es constante, sea cual sea la cantidad de datos a ordenar. El algortimo de la burbuja, el de selección directa, el de inserción directa y el de Shell son todos in-situ, y éste último, el de Shell, es el que mejor resultados da, sin ninguna duda de todos ellos y sus posibles variantes.



Video de como funciona Shell Sort...



Busqueda...

Busqueda
¨Es  el proceso de encontrar un elemento especifico de un  array.
¨ Técnicas  de  Busqueda:   Secuencial  y  Binaria.
¨ Es  necesario que  los  datos  estén ordenados por algun algoritmo.

Busqueda  Secuencial
 ¨Busca  un elemento de  una lista utilizando un valor destino  llamado  clave.  Los elementos  se exploran  en secuencia, uno despues  de otro.
¨Dato a  buscar= clave =6
Busqueda Binaria
¨ Se  situa la  lectura en el  centro  de la  lista y se  comprueba si  la  clave coincide con el valor del
elemento central. Si no se encuentra el valor de la clave, se situa en la mitad inferior o superior del
elemento central  de la  lista.



*** Video de busqueda y ordenacion.... ***




Funcion Hash

Función Hash
En informática, hash se refiere a una función o método para generar claves o llaves que representen de manera casi unívoca a un documento, registro, archivo, etc., resumir o identificar un dato a través de la probabilidad, utilizando una función hash o algoritmo hash. Un hash es el resultado de dicha función o algoritmo
Una función de hash es una función para resumir o identificar probabilísticamente un gran conjunto de información, dando como resultado un conjunto imagen finito generalmente menor (un subconjunto de los números naturales por ejemplo). Varían en los conjuntos de partida y de llegada y en cómo afectan a la salida similitudes o patrones de la entrada. Una propiedad fundamental del hashing es que si dos resultados de una misma función son diferentes, entonces las dos entradas que generaron dichos resultados también lo son.

Las tablas hash, una de las aplicaciones más extendidas de las funciones de hash, aceleran el proceso de búsqueda de un registro de información según una clave (nota: este uso de la palabra poco se relaciona con su significado habitual). Por ejemplo, una cadena alfanumérica puede ser utilizada para buscar la información de un empleado en la base de datos de un sistema.
La utilización de tablas hash provee un acceso casi directo a dichos registros, lo que significa que, en promedio, una búsqueda puede llegar a requerir sólo uno o dos intentos en la memoria o el archivo que contiene la información. Naturalmente, se prefiere una buena función de hash que evitará colisiones de hash.




lunes, 5 de diciembre de 2011

Metodo Quicksort

Algoritmo de Ordenamiento Quicksort.


Sea x un arreglo y n el número de elementos en arreglo que se debe ordenar. Elegir un elemento a de una posición especifica en el arreglo (por ejemplo, a puede elegirse como el primer elemento del arreglo. Suponer que los elemento de x están separados de manera que a está colocado en la posición j y se cumplen las siguientes condiciones.

1.- Cada uno de los elementos en las posiciones de 0 a j-1 es menor o igual que a.
2.- Cada uno de los elementos en las posiciones j+1 a n-1 es mayor o igual que a.

Observe que si se cumplen esas dos condiciones para una a y j particulares, a es el j-ésimo menor elemento de x, de manera que a se mantiene en su posición j cuando el arreglo está ordenado en su totalidad. Si se repite este procedimiento con los subarreglos que van de x[0] a x[j-1] y de x[j+1] a x[n-1] y con todos los subarreglos creados mediante este proceso, el resultado final será un archivo ordenado.

Ilustremos el quicksort con un ejemplo. Si un arreglo esta dado por:

x = [25 57 48 37 12 92 86 33]

y el primer elemento se coloca en su posición correcta, el arreglo resultante es:

x = [12 25 57 48 37 92 86 33]

En este punto 25 esta en su posición correcta por lo cual podemos dividir el arreglo en

x = [12] 25 [57 48 37 92 86 33]

Ahora repetimos el procedimiento con los dos subarreglos

x = 12  25  [48 37 33] 57 [92 86]

x = 12  25  33 [37 48]  57 [86] [92]

x = 12  25  33 [37 48]  57  86 92

x = 12  25  33 37 48  57  86 92

El procedimiento es entonces.

  • Buscar la partición del arreglo j.
  • Ordenar el subarreglo x[0] a x[j-1]
  • Ordenar el subarreglo x[j+1] a x[n-1]

Su implementación en Java es:

  public void quiksort(int x[],int lo,int ho)
  {
    int t, l=lo, h=ho, mid;

    if(ho>lo)
    {
      mid=x[(lo+ho)/2];
      while(l<h)
      {
        while((l<ho)&&(x[l]<mid))  ++l;
        while((h>lo)&&(x[h]>mid))  --h;
        if(l<=h)
        {
          t    = x[l];
          x[l] = x[h];
          x[h] = t;
          ++l;
          --h;
        }
      }

      if(lo<h) quiksort(x,lo,h);
      if(l<ho) quiksort(x,l,ho);
    }
  }


Ejemplo Hecho por La Mestra:


package quicksort;
public class Ordenador {

  public int[] quicksort(int numeros[])
   {
    return quicksort(numeros,0,numeros.length-1);
   }
    public int[] quicksort(int numeros[],int izq,int der)
   //se crea el arreglo a manejar
  {
   if(izq>=der)
  //compara que el valor d izquierda sea mayor al de derecha y regresa el valor
  //de numeros
   return numeros;
   int i=izq,d=der; 
   //compara que el valor d la variable "i" sea diferente de "d"
  
 if(izq!=der)
        {
        int pivote;
        int aux;
        pivote = izq; //aqui se le asgina el valor de izqueirda al pivite
        while(izq!=der)
        // se realiza la comparacion, para luego imprimir los nuevos resultados
        {
        imprimeArreglo(numeros);

         while(numeros[der]>=numeros[pivote] && izq<der)
      // comparacion en la que los numeros de derecha sean mayores o iguales
      //a pivote y que sea izquerda menor a derecha
               der--;//decrementa derecha
        while(numeros[izq]<numeros[pivote] && izq<der)
   //casi misma comapracion pero inverza, ahora con izqueirda que sea menor
   //al pivote
               izq++;//incrementa izqueirda
         if(der!=izq)
         {
             aux = numeros[der];
            numeros[der]= numeros[izq];
//se le asginan los valores de derecha a los numeros izqueirda
            numeros[izq]=aux;}
// y los de izquierda toma el valor de aux q es igual a los de derecha
        }
        if(izq==der){ // se comparan si los valores son iguales
            quicksort(numeros,i,izq-1);//
            quicksort(numeros,izq+1,d);//
        }
        }
        else
            return numeros;  //regresa los numeros de cada uno
       return numeros;
    }


    public void imprimeArreglo(int arreglo[])
    {
        String imp="";
        for(int i=0;i<arreglo.length;i++)
// que i sea menor al tamaño del arreglo
        {
            if(i!=arreglo.length-1) //que i sea diferente
            imp=imp+arreglo[i]+",";
// imprime el arreglo que tomara la variable "i" q kontendra los numeros
            else
                imp=imp+arreglo[i]+"";
        }
        System.out.println(imp);
    }
    public static void main(String[] args) {
        int array[] ={4,2,5,7,6,1,3};
//valores estaticos asignados que seran ordenados del cual el 4 sera el pivote,
//que es valor que esta a la izquierda
Ordenador a = new Ordenador();
a.quicksort(array);
//los valores del arreglo pasan por el metodo quicksort
//el cual contiene las comparaciones a realizar para poder ordenarlos y obtener
//un nuevo orden.
//
    }//es un metodo que mejor funcionar debido a su eficiencia
}


Video de Quicksort...