DEBER DE ESTRUCTURAS![]()
1.- Para implementar una estructura abstracta, debemos considerar tres factores Velocidad de búsqueda, Uso de la memoria y La información deba estar ordenada o no, ¿Cuál escogería usted como factor principal?, indique el por qué justificándolo con código en java.![]()
Quizás el que menos importe para aplicaciones no-embebidas es el punto de la memoria. En general cualquier estructura que tenga un orden de búsqueda decente no utiliza memoria a mansalva.
Por lo que nos quedan dos pesos pesados bien claros, velocidad de búsqueda y si la información debe o no estar ordenada.
Las dos estructuras obvias que uno piensa en estos casos son: árboles binarios balanceados (AVL o rojo-negro por ejemplo) y la sencilla pero ingeniosa tabla hash.
BUSQUEDA HASHING
Existe otro método que puede aumentar la velocidad de búsqueda donde los datos no necesitan estar ordenados y esencialmente es independiente del número n. Este método se conoce como transformación de claves (clave- dirección) o hashing. El hashing consiste en convertir el elemento almacenado (numérico o alfanumérico) en una dirección (índice) dentro del array.
La idea general de usar la clave para determinar la dirección del registro es una excelente idea, pero se debe modificar de forma que no se desperdicie tanto espacio. Esta modificación se lleva a cabo mediante una función que transforma la clave en un índice de una tabla y que se denomina función de randomización o Hash. Si H es una función hash y X es un elemento a almacenar, entonces H(X) es la función Hash del elemento y se corresponde con el índice donde se debe colocar X. En nuestro ejemplo, la función hash sería
H(X) = X % 1000
Los valores generados por H deben cubrir todo el conjunto de índices de la tabla.
n= número de elementos en el vector
x= valor a buscar
void Hashing(){
int d=0,dx=0;
d=( x%n)+1;
if(a[d] = = x )
printf("valor encontrado");
else{
dx = d + 1;
while( (d < n) && (a[dx] != x) && (a[dx] != 0) && (dx != d) ){
dx = dx + 1;
if(dx = = n)
dx = 1;
}
}
}
dx= posición en el vector del elemento a buscar
2.- Las tablas Hash, teóricamente tiende a un orden mínimo tanto en Búsqueda como inserción y eliminación, en la práctica difícilmente se cumple, explique Por qué. Investigue.![]()
Esto en la práctica difícilmente se cumpla, ya que generar una clave hash única e irrepetible para cada elemento es una tarea casi imposible para una cantidad grande de elementos. Hablamos del orden de 10000 elementos o más.
3.- Implemente un ejercicio con Tablas Hash en Java.![]()
import java.util.Dictionary;
import java.util.Hashtable;
class HTDemo {
public static void main(String args[]) {
Hashtable ht = new Hashtable();
ht.put("title", "Manual de Java");
ht.put("author", "Algunos");
ht.put("email", "nise...@puesalli.es");
show(ht);
}
static void show(Dictionary d) {
System.out.println("Titulo: " + d.get("title"));
System.out.println("Autor: " + d.get("author"));
System.out.println("E-mail: " + d.get("email"));
System.out.println("");
}
}
ki < x < ki + 1 para 1 ≤i < n. La búsqueda continúa en la página ri.
kn < x. La búsqueda continúa en la página rn.
x < k1. La búsqueda continúa en la páginar0. Si en algún caso la referencia es nula, es decir, si no hay página descendiente, entonces no hay ningún elemento x en todo el árbol y se acaba la búsqueda.
public boolean buscar(Object o)
{
if (o.equals(valor))
return true;
else if (o.compareTo(valor)<0)
return buscar(getIzq(),o);
else return buscar(getDer(),o);
}
Difícilmente se cumple por el problema de colisiones ya que estas tienen que ser resueltas por una búsqueda lineal y la función tienden a generar valores similares.
Otro problema es el aglomeraniento cuando las llaves usadas comúnmente tiendan a caer muy cerca unas de otras o incluso consecutivamente en la tabla hash y esto degrada el funcionamiento y cuando la tabla se llena usando ciertas estrategias de resolución de colisiones, como el sondeo linea
Pregunta 3

Para implementar una estructura abstracta, debemos considerar
tres factores
Velocidad de búsqueda, Uso de la memoria y La información deba
estar ordenada o no,
¿Cuál escogería usted como factor principal?, indique el por
qué justificándolo con código en java.
2.- Las tablas Hash, teóricamente tiende a un orden mínimo tanto en
búsqueda como inserción
y eliminación, en la práctica difícilmente se cumple, explique
por qué. Investigue
Por otro lado, la tabla hash teórica tiende a un orden mínimo tanto en búsqueda como inserción y eliminación, que sería O(1). Esto en la práctica dificilmente se cumpla, ya que generar una clave hash unica e irrepetible para cada elemento es una tarea casi imposible para una cantidad grande de elementos. Hablamos del orden de 10000 elementos o mas. Si querés ver mas sobre tablas hash podes verlo
3.- Implemente un ejercicio con Tablas Hash en Java.
Los factores más importantes que podemos considerar son dos:
1. La velocidad de búsqueda.
2. Los datos deben estar ordenados o no
ya que usar la memoria sería un gran desperdicio.
para eso temenos un algoritmo conocido como Hashing
Ejemplo:
void Hashing(){
int d=0,dx=0;
d=( x%n)+1;
if(a[d] = = x )
printf("valor encontrado");
else{
dx = d + 1;
while( (d < n) && (a[dx] != x) && (a[dx] != 0) && (dx !=
d) ){
dx = dx + 1;
if(dx = = n)
dx = 1;
}
}
}
2do. Tema:
Las tablas hash generan un código de identificación único.
Esto en la práctica no se cumple ya que para muchos datos
(1000,5000,10000,etc) es mas propenso a errores.
Esto si funcionaría si estaríamos hablado de pocos Datos ya que la
posiblilidades de errores son mínimas.
1.-
Pues a mi parecer el
factor más importante a considerar es la
velocidad de la búsqueda ya que si nos ponemos a considerar los otros
factores, pues nos damos cuenta que estos son menos relevantes ya que
si hablamos del uso de la memoria nos damos cuenta que en este tiempo
disponemos de una cantidad enorme de memoria para poder trabajar y si
tomamos en cuenta el factor "Ordenamiento de Información" pues Las
tablas hash almacenan la información en posiciones pseudo-aleatorias,
así que el acceso ordenado a su contenido es bastante lento.
public void buscarHash(Object elemb, int nmax){
int x=elemb.hashCode();
if(x<0){
x =-1;
}
int pos=x%nmax;
if(tabla[pos]==null){
System.out.println("El Elemento no se encontro");
}else{
if(tabla[pos].equals(elemb)){
System.out.print("Elemento encontrado
"+elemb+ " su posicion es : "+ pos);
}else{
int j=pos+1;
if(j==tabla.length){
j=0;
}
while((tabla[j]!=elemb)&&(tabla[j]!=null)&&
(j!=pos)){
j++;
if (j>=tabla.length-1){
j=0;
}
}
if(tabla[j].equals(elemb)){
System.out.print("Elemento
encontrado, "+elemb+ " su posicion es :"+j);
}else{
System.out.print("Elemento
no encontrado");
}
}
}
}
2.-
La teoría se cumple
cuando podriamos estar hablando de pocos
elementos, pero es imposible que se cumpla cuando hablamos de muchos
elementos.
Ya que una tabla hash genera una clave única para cada elemento, por
eso para pocos datos si es posible; pero para una cantidad de datos
extensa, es más propenso a que ocurra algún error.
3.-