Documentos de Académico
Documentos de Profesional
Documentos de Cultura
1. Implemente un método que, dado un árbol binario ordenado y un valor, retorne el sucesor
Solución
import java.util.ArrayList;
import java.util.List;
public class SucesorVEDArbin<E> {
protected Integer val;
protected SucesorVEDArbin<Integer> izq;
protected SucesorVEDArbin<Integer> der;
//Arbol Vacio
public SucesorVEDArbin() {
val=null;
izq=null;
der=null;
}
//Arbol no vacío
public SucesorVEDArbin (Integer pVal, SucesorVEDArbin<Integer> pIzq,
SucesorVEDArbin<Integer> pDer) {
if (pVal==null) {
throw new NullPointerException ("¡Un Arbol no vacío debe tener
raíz!");}
if (pIzq==null) {
throw new NullPointerException ("¡Un Arbol no vacío debe tener
Subárbol izquierdo");}
if (pDer==null) {
throw new NullPointerException ("¡Un Arbol no vacío debe tener
Subárbol Derecho!");}
val=pVal;
izq=pIzq;
der=pDer;
}
public static <E> void main(String[] args) {
// Crear nuevo Arbol
SucesorVEDArbin<Integer> nArbol=new SucesorVEDArbin<>();
int Cantnodos=ent_ramdom()/2;
//Invocar Insertar elementos en el arbol
for(int i=0;i<Cantnodos;i++) {
int Elemento=ent_ramdom();
if (nArbol.Buscar(Elemento)) { //si el elemento se repite no aumenta i y
//busca otro elemento; usamos metodo busqueda
i--;}
else {nArbol.insertar(Elemento);}//Si elemento no es repetido se
//inserta en el arbol;Usamos metodo busqueda
}
//Imprimir raiz y Recorrido
System.out.println("Dado el Arbol de busqueda");
System.out.println(nArbol.inorden());
System.out.println("\n");
//Método insertar
public void insertar (Integer nElemento) {
if(esVacio()) {
this.val=nElemento;
this.izq= new SucesorVEDArbin<>();
this.der= new SucesorVEDArbin<>();
}else {
if(this.val>nElemento) {
if (this.izq==null) {
this.izq=new SucesorVEDArbin<>(nElemento,new
SucesorVEDArbin<>(),new SucesorVEDArbin<>());
}else {this.izq.insertar(nElemento);}
}else {
if(this.der==null) {
this.der= new SucesorVEDArbin<>(nElemento,new
SucesorVEDArbin<>(),new SucesorVEDArbin<>());
}else {
this.der.insertar(nElemento);
}
}
}
}
//***********Sub 17 Método Recursivo Buscar Elemento en el
//arbol******************************
2. Investigue en qué consiste cada una de las siguientes estrategias de resolución de colisiones
A. Sondeo lineal
B. Sondeo cuadrático
C. Doble hash
Solución
clave-valor y buscar, asociado a una clave determinada. Se creó en 1954 Gene Amdahl,
Elaine M. McGraw y Arthur Samuel. Junto con el sondeo cuadrático y el de hash doble,
el sondeo lineal es una forma de direccionamiento abierto (método que resuelve las
hasta encontrar una ranura que no esté utilizada). Puntualmente el sondeo lineal se
ejecuta al momento en el que la función hash provoca una colisión al asignar una nueva
clave a una celda de la tabla hash que ya está ocupada por otra clave, eventualmente el
sondeo lineal buscará en la propia tabla la siguiente ubicación libre más cercana para
tendría que buscar 1 por 1 en los índices hasta encontrar un espacio vacío para el
En caso de producirse una colisión, con este método y el uso de un ciclo for o while (int
estarlo, se seguirá buscando hasta encontrarlo; es de aclarar que no solamente se puede buscar
en el siguiente índice, se puede buscar saltando cada 2, 3, 4 etc., índices, pero sigue siendo una
operación lineal, y en caso de que el índice vació esté en la última posición la complejidad sería
O(n).
if(HashSetA.get(i)==null) {
return i;
}
}
return null;
}
En este caso como en el cuadrático, retornamos el índice que se encuentra vacío para con otro
para resolver colisiones hash en tablas hash. El sondeo cuadrático funciona tomando el índice
hash original y agregando valores sucesivos de un polinomio cuadrático arbitrario hasta que se
El sondeo cuadrático puede ser el algoritmo más eficiente en una tabla de direccionamiento
abierta, porque evita el problema de agrupamiento que puede ocurrir con el sondeo
memoria cache porque conserva alguna localidad de referencia; sin embargo, el sondeo
lineal tiene mayor localidad, por lo que es un mejor rendimiento en cache. (hmong.es).
Simplificando un poco lo anterior el sondeo cuadrático, consiste al igual que en el sondeo lineal
en buscar un índice vacío cuando se produce una colisión; pero en este caso para buscar
dicho índice vacío lo que se hace es que el índice resultado de la función hash se suma
a un contador incremental que está elevado al cuadrado, es decir, si el índice que nos
Tabla Hash
Elemento Tamaño tabla Hash Indice Contador i Cálculo indice Nuevo Indice Indice elemento
85 21 1 0
14 21 14 1 85
35 21 14 1 14+1 15 2
36 21 15 2 15+4 19 3
12 21 12 4
48 21 6 5 89
89 21 5 6 48
50 21 8 7
41 21 20 8 50
64 21 1 3 1+9 10 9
10 64
11
12 12
13
14 14
15 35
16 37
17
18
19 36
(Fuente : elaboración propia) 20 41
Al igual que en el sondeo lineal para incrementar el contador se puede usar un ciclo for o
while (int i=0, i<tablasHash.size(), i++), sin embargo, en este caso la como i debe estar al
cuadrado entonces la primera línea del método debe contener i=(int) Math.pow(i,2) de esta
manera podemos hacer las operaciones correspondientes y retornar el nuevo índice.
C. Doble hash: El doble hash es una técnica de programación informática que se utiliza junto
con el direccionamiento abierto en tablas hash para resolver colisiones hash, mediante el uso
de un hash secundario de la clave como compensación cuando se produce una colisión. El hash
doble con direccionamiento abierto es una estructura de datos clásica en una tabla. La técnica
de doble hash utiliza un valor hash como índice en la tabla y luego avanza repetidamente un
intervalo hasta que se encuentra el valor deseado, se alcanza una ubicación vacía o se ha
buscado en toda la tabla; pero este intervalo lo establece una segunda función hash
lineal y sondeo cuadrático el intervalo depende de los datos, por lo que los valores que se
El intervalo entre intentos es constante para cada registro, pero es calculado por otra función
hash. (hmong.es)
(Acervolima.com)
3. Escriba una función java que, dados dos arreglos de enteros S = [s0, s1, …, sm-1] y T = [t0,
Solución
import java.util.HashSet;
public class Conjuntos<E>{
//Atributos de la clase conjuntos <E>
protected int elementos;
protected int tamanoHashset;
protected HashSet<Integer> TablaHash;
//Metodo constructor
public Conjuntos(int Elem){
elementos=Elem; //Elem aleatorio
tamanoHashset=Elem*4; //Tamaño inicial es Elem * 4, procurando factor de
//carga <30% (La clase por si misma procura factor de carga 0.75)
TablaHash= new HashSet<Integer>(tamanoHashset); //factor de carga <30%
//procurando evitar que la clase redimensione la tabla hash.
}
public static void main(String[] args) {
//Crear conjuntos aleatorios, para probar cualquier instancia del problema
Conjuntos<Integer> ConjuntoS=new Conjuntos<Integer>(NumerosAleatorios()/4);
//Procurar que elementos T>S para prueba del algoritmo.
Conjuntos<Integer> ConjuntoT=new Conjuntos<Integer>(NumerosAleatorios()*2);
//Procurar que elementos T>S para prueba del algoritmo.
ConjuntoS.AgregarElementos(ConjuntoS.TablaHash,ConjuntoS.elementos);
//Agregar elementos a S
ConjuntoT.AgregarElementos(ConjuntoT.TablaHash,ConjuntoT.elementos);
//Agregar elementos a T
https://hmn.wiki/es/Open_addressing
https://hmn.wiki/es/Linear_probing
https://www.youtube.com/watch?v=9tZsDJ3JBUA
Sondeo cuadrático en hash – Acervo Lima. (s. f.). acervolima.com. Recuperado 27 de julio de
2022, de https://es.acervolima.com/sondeo-cuadratico-en-hash/