You are on page 1of 15

CENTRO AMERICANO DE ESTUDIOS SUPERIORES

INGENIERIA EN SISTEMAS

CUARTO CUATRIMESTRE

ESTRUCTURA DE DATOS

UNIDAD
4.- METODO DE ORDENAMIENTO POR DISTRIBUCIN
5.- METODOS DE BUSQUEDA

PROFESOR: ARMANDO

ALUMNA:

CD DEL CARMEN CAMPECHE A 07 DE OCTUBRE DE 2014
INTRODUCCIN
Algoritmos de ordenamiento por distribucin
La ordenacin y la bsqueda son operaciones fundamentales en informtica. La
ordenacin se refiere a la operacin de organizar datos en algn orden dado, tal como
creciente o decreciente para datos numricos o alfabticamente para datos de caracteres.
La bsqueda se refiere a la operacin de encontrar la posicin de un tem dado de entre
un conjunto de tems.
Existen muchos algoritmos de ordenacin y bsqueda. En particular, el algoritmo que uno
elija depender de las propiedades de los datos y de las operaciones que se desee realizar
sobre los datos. De acuerdo con esto, queremos saber la complejidad de cada algoritmo; o
sea, queremos saber el tiempo de ejecucin f(n) de cada algoritmo como una funcin del
nmero n de elementos de entrada.
Bsqueda secuencial
La bsqueda es la operacin ms importante en el procesamiento de informacin, ya que
permite recuperar datos previamente almacenados. El resultado de una bsqueda puede
ser un xito, si se encuentra la informacin o un fracaso, si no la encuentra.
La bsqueda se puede aplicar sobre elementos previamente ordenados o sobre
elementos desordenados, en el primer caso la bsqueda es ms fcil, en cambio en el
segundo se dificulta un poco ms el proceso, sobre todo cuando de se trata de encontrar
una cantidad de elementos similares.









4.- METODO DE ORDENAMIENTO POR ISTRIBUCIN
4.1.- DISTRIBUCION SIMPLE
Este algoritmo tiene la siguiente metodologa: Ordena el vector tomando cada nmero e
insertndolo en la posicin que toma su valor, es decir, tengo un cinco en el arreglo; lo
pongo en la posicin cinco, algo as como: lo que valgas en esa posicin te pongo. Por
supuesto, no se podrn ordenar los arreglos que tengan valores repetidos y el vector
necesita estar del tamao del nmero ms grande que se encuentre en l.
Principios de distribucin
Cuando los datos tienen ciertas caractersticas como por ejemplo estar dentro de
determinado rango y no haber elementos repetidos, pueden aprovecharse estas
caractersticas para colocar un elemento en su lugar, por ejemplo:
Origen 0 1 2 3 4 5 6 7 8 9 7 1 3 0 4 2 6 5 8 9
Destino
0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9
A continuacin se presenta el cdigo para cambiar los valores del Origen al Destino:
for(int x=0; x<10;x++)
destino[origen[x]]=origen[x];
Que hacer cuando se repitan los datos?
Lo que debemos hacer es incrementar la capacidad de la urna. Para lograrlo podemos
hacer lo siguiente:
1.- Definir un arreglo en el que cada posicin puede ser ocupada por mas de un registro
(un arreglo de arreglo de registros) puede darse la situacin de ser insuficiente la cantidad
de registros adicionales o de existir demasiado desperdicio de memoria.
2.- Definir el tamao de la urna variable a travs del uso de estructuras como las listas
simples enlazadas.
Urna simple
struct nodo
{
_______ info;
struct nodo *sig;
}

nodo *nuevo, *ini[10], *fin[10];
int i,p;

void main()
{
for(i=0;i<10:i++)
ini=fin=NULL;
for(i=0;i<ni++)
{
nuevo=new nodo;
nuevo->info=A;
nuevo-> sig=NULL;
if(ini[A]==NULL)
ini=fin=nuevo;
else
{
fin->sig=nuevo;
fin=nuevo;
}
for(i=0,p=0; i<10;i++)
{
nuevo=ini;
while(nuevo)
{
A[p]=nuevo->info;
p++;
ini=nuevo->sig;
delete nuevo;
nuevo=ini;
}
}
}
Que hacer cuando el rango de los valores que queremos ordenar es de 100 a 999?
Aplicar urnas simples tantas veces como dgitos tenga el mayor de los nmeros a ordenar.
Para la ordenacin se har de la siguiente manera: En la primera pasada se tomar en
consideracin el digito menos significativo (unidades), en la siguiente vuelta se tomar el
siguiente digito hasta terminar (Decenas, Centena,).
void main()
{
for(cont=1; cont<=veces; cont++)
{
for (y=0; i<n; y++)
{
np=A% (i*10cont);
np=np/(1* 10 cont - 1 );
urnas_simples();
}
}
}

4.2.- METODO DE RADIX O RAIZ

Es un algoritmo de ordenamiento que ordena enteros procesando sus dgitos de forma
individual. Como los enteros pueden representar cadenas de caracteres (por ejemplo,
nombres o fechas) y, especialmente, nmeros en punto flotante especialmente
formateados, Radix sort no est limitado slo a los enteros.
Existen dos clasificados del mtodo de Radix:
LSD ---->>>dgito menos significativo
MSD --->>>dgito ms significativo
Radix sort LSD procesa las representaciones de enteros empezando por el dgito menos
significativo y movindose hacia el dgito ms significativo.
Radix sort MSD trabaja en sentido contrario.
Este ordenamiento se basa en los valores de los dgitos reales en las representaciones de
posiciones de los nmeros que se ordenan.
Por ejemplo el nmero 235 se escribe 2 en la posicin de centenas, un 3 en la posicin de
decenas y un 5 en la posicin de unidades.Reglas para ordenar. Empezar en el dgito ms
significativo y avanzar por los dgitos menos significativos mientras coinciden los dgitos
correspondientes en los dos nmeros. El nmero con el dgito ms grande en la primera
posicin en la cual los dgitos de los dos nmeros no coinciden es el mayor de los dos (por
supuesto s coinciden todos los dgitos de ambos nmeros, son iguales).Este mismo
principio se toma para Radix Sort, para visualizar esto mejor tenemos el siguiente ejemplo.
En el ejemplo anterior se ordeno de izquierda a derecha. Ahora vamos a ordenar de
derecha a izquierda.

CDIGO
public class Radix
{ void Radix (int[] arr)
{
if(arr.length==0)
return;
int[][] np = new int[arr.length][2];
int[] q = new int[0x100];
int i,j,k,l,f =0;
for(k=0;k<4;k++)
{
for(i=0;i<(np.length-1);i++)
np[i][1]= i+1;
np[i][1]=-1;
for(i=0;i<q.length;i++)
q[i]=-1;
for(f=i=0;i<arr.length;i++){
j =((0xFF<<(k<<3))&arr[i])>>(k<<3);
if(q[j]==-1)
l = q[j]= f;
else {
l = q[j];
while(np[l][1]!=-1)
l = np[l][1];
np[l][1]= f;
l = np[l][1];
}
f = np[f][1];
np[l][0]= arr[i];
np[l][1]=-1;
}
for(l=q[i=j=0];i<0x100;i++)
for(l=q[i];l!=-1;l=np[l][1])
arr[j++]= np[l][0];
}
void main(String[] args)
{
int i;
int[] arr = new int[15];
System.out.print("original: ");
for(i=0;i<arr.length;i++)
{
arr[i]=(int)(Math.random()*1024);
System.out.print(arr[i]+" ");
}
Radix (arr);
System.out.print("\nordenados: ");
for(i=0;i<arr.length;i++)
System.out.print(arr[i]+" ");
System.out.println("\nHecho.");
}
}
5.- METODOS DE BUSQUEDA
5.1.- BUSQUEDA SECUENCIAL
La bsqueda secuencial consiste en recorrer secuencialmente un array desde el primer
elemento hasta el ltimo y comprobar si alguno de los elementos del array contiene el
vector buscado, es decir, comparar cada elemento del array con el valor buscado. Dado
que el array no est en ningn orden particular, existe la misma probabilidad de que el
valor se encuentre, ya sea en el primer elemento como en el ltimo. Por tanto, en
promedio, el programa tendr que comparar el valor buscado con la mitad de los
elementos del arreglo.
La bsqueda secuencial requiere, para el peor de los casos, cuando el elemento a buscar
es el ltimo o no se encuentra, recorrer todo el vector y realizar un nmero de
comparaciones igual al tamao del vector, de lo que deducimos que para vectores con
muchos elementos esta bsqueda puede no ser conveniente.
El mtodo de bsqueda lineal funciona bien para arrays pequeos o para arrays no
ordenados. Si el array est ordenado, se puede utilizar la tcnica de alta velocidad de
bsqueda binaria.
El siguiente algoritmo ilustra un esquema de implementacin del algoritmo de bsqueda
secuencial:

for(i=j=0;i<N;i++)
if(array[i]==elemento)
{
solucion[j]=i;
j++;
}
Este algoritmo se puede optimizar cuando el array est ordenado, en cuyo caso la
condicin de salida cambiara a:

for(i=j=0;array[i]<=elemento;i++)

o cuando slo interesa conocer la primera ocurrencia del elemento en el array:

for(i=0;i<N;i++)
if(array[i]==elemento)
break;
En este ltimo caso, cuando slo interesa la primera posicin, se puede utilizar un
centinela, esto es, dar a la posicin siguiente al ltimo elemento de array el valor del
elemento, para estar seguro de que se encuentra el elemento, y no tener que comprobar
a cada paso si seguimos buscando dentro de los lmites del array:

array[N]=elemento;
for(i=0;;i++)
if(array[i]==elemento)
break;
Si al acabar el bucle, i vale N esto indica que no se encontr el elemento. El nmero medio
de comparaciones que hay que hacer antes de encontrar el elemento buscado es de
(N+1)/2.

5.2.- BUSQUEDA BINARIA
Si los elementos sobre los que se realiza la bsqueda estn ordenados, entonces podemos
utilizar un algoritmo de bsqueda mucho ms rpido que el secuencial, la bsqueda
binaria. El algoritmo consiste en reducir paulatinamente el mbito de bsqueda a la mitad
de los elementos, basndose en comparar el elemento a buscar con el elemento que se
encuentra en la mitad del intervalo y en base a esta comparacin:
Si el elemento buscado es menor que el elemento medio, entonces sabemos que
el elemento est en la mitad inferior de la tabla.
Si es mayor es porque el elemento est en la mitad superior.
Si es igual se finaliza con xito la bsqueda ya que se ha encontrado el elemento.
Se puede aplicar tanto a datos en listas lineales (Vectores, Matrices, etc.) como en rboles
binarios de bsqueda. Los prerrequisitos principales para la bsqueda binaria son:
La lista debe estar ordenada en un orden especifco de acuerdo al valor de la llave.
Debe conocerse el nmero de registros.
La bsqueda binaria consiste en dividir el array por su elemento medio en dos subarrays
ms pequeos, y comparar el elemento con el del centro. Si coinciden, la bsqueda se
termina. Si el elemento es menor, debe estar (si est) en el primer subarray, y si es mayor
est en el segundo. Por ejemplo, para buscar el elemento 3 en el array {1,2,3,4,5,6,7,8,9}
se realizaran los siguientes pasos:
Se toma el elemento central y se divide el array en dos:
{1,2,3,4}-5-{6,7,8,9}

Como el elemento buscado (3) es menor que el central (5), debe estar en el primer
subarray: {1,2,3,4}

Se vuelve a dividir el array en dos:
{1}-2-{3,4}

Como el elemento buscado es mayor que el central, debe estar en el segundo subarray:
{3,4}
Se vuelve a dividir en dos:
{}-3-{4}

Como el elemento buscado coincide con el central, lo hemos encontrado.

Si al final de la bsqueda todava no lo hemos encontrado, y el subarray a dividir est
vacio {}, el elemento no se encuentra en el array. La implementacin sera:

int desde,hasta,medio,elemento,posicion; // desde y hasta indican los lmites del array
que se est mirando.
int array[N];
// Dar valor a elemento.
for(desde=0,hasta=N-1;desde<=hasta;)
{
if(desde==hasta) // si el array slo tiene un elemento:
{
if(array[desde]==elemento) // si es la solucin:
posicion=desde; // darle el valor.
else // si no es el valor:
posicion=-1; // no est en el array.
break; // Salir del bucle.
}
medio=(desde+hasta)/2; // Divide el array en dos.
if(array[medio]==elemento) // Si coincide con el central:
{
posicion=medio; // ese es la solucin
break; // y sale del bucle.
}
else
if(array[medio]>elemento) // si es menor:
hasta=medio-1; // elige el array de la izquierda.
else // y si es mayor:
desde=medio+1; // elige el array de la derecha.
}
Versin recursiva de la Bsqueda Binaria.
Su nica novedad es que despus de comparar el elemento de bsqueda con el elemento
de la mitad de la tabla, se invoca recursivamente a realizar la bsqueda en uno de los dos
posibles intervalos, el inferior o el superior, finalizando en el momento en el que se
encuentre el elemento o ya se tenga un nico elemento y no coincida con el buscado.
int binariaRecursiva(int A[], int X, int inicio, int fin)
{
int medio;
if (inicio > fin) return -1;
else
{
medio = inicio+(inicio+fin)/2;
if (A[medio] < X) return binariaRecursiva(A,X,medio+1,fin);
else if (A[medio] > X) return binariaRecursiva(A,X,inicio,medio -1);
else return medio;
}
}









5.3.- METODO DE BUSQUEDA HASH
Bsqueda Hash

En este mtodo se requiere que los elementos estn ordenados.
El mtodo consiste en asignar el ndice a cada elemento mediante una transformacin
del elemento, esto se hace mediante una funcin de conversin llamada funcin hash.
Hay diferentes funciones para transformar el elemento y el nmero obtenido es el
ndice del elemento.

La principal forma de transformar el elemento es asignarlo directamente, es decir al 0
le corresponde el ndice 0, al 1 el 1, y as sucesivamente pero cuando los elementos
son muy grandes se desperdicia mucho espacio ya que necesitamos arreglo grandes
para almacenarlos y estos quedan con muchos espacios libres, para utilizar mejor el
espacio se utilizan funciones mas complejas.

La funcin de hash ideal debera ser biyectiva, esto es, que a cada elemento le
corresponda un ndice, y que a cada ndice le corresponda un elemento, pero no
siempre es fcil encontrar esa funcin, e incluso a veces es intil, ya que puedes no
saber el nmero de elementos a almacenar. La funcin de hash depende de cada
problema y de cada finalidad, y se pueden utilizar con nmeros o cadenas, pero las
ms utilizadas son:

1.- Restas sucesivas:

Esta funcin se emplea con claves numricas entre las que existen huecos de tamao
conocido, obtenindose direcciones consecutivas. Un ejemplo serian los alumnos de
ingeniera en sistemas que entraron en el ao 2005 sus nmeros de control son
consecutivos y esta definido el numero de alumnos.
05210800 -05210800 0
05210801 -05210800 1
05210802 -05210800 2

05210899 -05210800 99

2.- Aritmtica modular:

El ndice de un nmero es resto de la divisin de ese nmero entre un nmero
N prefijado, preferentemente primo. Los nmeros se guardarn en las
direcciones de memoria de 0 a N-1. Este mtodo tiene el problema de que dos o
ms elementos pueden producir el mismo residuo y un ndice puede ser
sealado por varios elementos. A este fenmeno se le llama colisin. Si el
nmero N es el 7, los nmeros siguientes quedan transformados en:
1679 > 6
4567 > 3
8471 > 1
0435 > 1
5033 > 0
Mientras mas grande sea nmero de elementos es mejor escoger un nmero primo
mayor para seccionar el arreglo en ms partes. El nmero elegido da el nmero de
partes en que se secciona el arreglo, y las cada seccin esta compuesta por todos los
elementos que arrojen el mismo residuo, y mientras mas pequeas sean las secciones
la bsqueda se agilizara mas que es lo que nos interesa.

3.- Mitad del cuadrado:

Consiste en elevar al cuadrado la clave y coger las cifras centrales. Este mtodo
tambin presenta problemas de colisin.
709^2=502681 > 26
456^2=207936 > 79
105^2=11025 > 10
879^2=772641 > 26
619^2=383161 > 31
Nota: en caso de que la cifra resultante sea impar se toma el valor nmero y el
anterior.

4.- Truncamiento:

Consiste en ignorar parte del nmero y utilizar los elementos restantes como ndice.
Tambin se produce colisin. Por ejemplo, si un nmero de 7 cifras se debe ordenar en
un arreglo de elementos, se pueden tomar el segundo, el cuarto y el sexto para formar
un nuevo nmero:
5700931 > 703
3498610 > 481
0056241 > 064
9134720 > 142
5174829 > 142

5.- Plegamiento:

Consiste en dividir el nmero en diferentes partes, y operar con ellas (normalmente
con suma o multiplicacin). Tambin se produce colisin. Por ejemplo, si dividimos el
nmero de 7 cifras en 2, 2 y 3 cifras y se suman, dar otro nmero de tres cifras (y si
no, se toman las tres ltimas cifras):

5700931 > 57 + 00 + 931 = 988
3498610 > 34 + 98 + 610 = 742
0056241 > 00 + 56 + 241 = 297
9134720 > 91 + 34 + 720 = 845
5174929 > 51 + 74 + 929 = 1054

Nota: Estas solo son sugerencias y que con cada problema se pude implementar una
nueva funcin hash que incluso tu puedes inventar o formular.

Tratamiento de colisiones
Hay diferentes maneras de solucionarlas pero lo ms efectivo es en vez de crear un
arreglo de nmero, crear un arreglo de punteros, donde cada puntero seala el
principio de una lista enlazada. As, cada elemento que llega a un determinado ndice
se pone en el ltimo lugar de la lista de ese ndice. El tiempo de bsqueda se reduce
considerablemente, y no hace falta poner restricciones al tamao del arreglo, ya que
se pueden aadir nodos dinmicamente a la lista.







PRUEBA LINEAL

Consiste en que una vez detectada la colisin se debe recorrer el arreglo
secuencialmente a partir del punto de colisin, buscando al elemento. El proceso de
bsqueda concluye cuando el elemento es hallado, o bien cuando se encuentra una
posicin vaca. Se trata al arreglo como a una estructura circular: el siguiente
elemento despus del ltimo es el primero. La funcin de rehashing es, por tanto, de la
forma: R(H(X)) = (H(X) + 1) % m (siendo m el tamao del arreglo) Ejemplo: Si la
posicin 397 ya estaba ocupada, el registro con clave 0596397 es colocado en la
posicin 398, la cual se encuentra disponible. Una vez que el registro ha sido insertado
en esta posicin, otro registro que genere la posicin 397 o la 398 es insertado en la
posicin siguiente disponible.















CONCLUCIN

Cada uno de los 2 mtodos de ordenamiento difiere tanto en cdigo y estructura. Y su
manera de realizar las comparaciones. El mtodo simple solo acomoda segn los valores
dependiendo el valor que tiene y el radix te da un numero entero conformado por varios
este los separa en unidades y dependiendo su valor y posicin en las unidades los
acomoda.

En los mtodo de bsqueda tenemos que el secuencial para buscar un numero se tienen
que recorrer todo el vector ya que hay muchas posibilidades de encontrarse con el valor
repetido. En el binario el vector debe estar ordenado este es dividido a la mitad y se ase
una comparacin con el nmero que se localiza a la mitad para saber en que parte del
vector se localiza el numero.














BIBLIOGRAFAS

http://www.programacionfacil.com/estructura_datos_csharp/algoritmos_distribucion
http://www.estructuradedatos.galeon.com/Distrib_Simple.html
http://es.wikipedia.org/wiki/Algoritmo_de_b%C3%BAsqueda
https://sites.google.com/site/estdatjiq/home/unidad-vi

You might also like