1. Se tiene un árbol binario de búsqueda, apuntado por la variable

Anuncio
1. Se tiene un árbol binario de búsqueda, apuntado por la variable estática, de tipo pnodo,
denominada raiz.
a)
Diseñar la función recursiva mr, tal que la siguiente invocación, deje como nodo raíz el
nodo con mayor valor de clave: raiz = mr( raiz);
50 puntos.
b) Diseñar la función iterativa m, tal que la siguiente invocación, deje como nodo raíz el nodo con
mayor valor de clave: m( & raiz);
50 puntos.
En ambos casos el árbol resultante debe ser binario de búsqueda.
Solución.
pnodo lrot( pnodo t)
{ pnodo temp = t->right;
t->right = temp->left;
temp->left = t;
return ( temp );
}
//Coloca en la raíz el nodo con mayor valor. Iterativo
void m( pnodo * pp)
{ while( *pp != NULL)
if ( (*pp)->right != NULL ) *pp = lrot(*pp);
else break;
}
//Coloca en la raíz el nodo con mayor valor. Recursivo
pnodo mr( pnodo t)
{ if( t != NULL)
if (t->right != NULL)
{ t->right = mr(t->right);
t = lrot(t);
}
return (t);
}
Notar que la función recursiva deja al árbol más balanceado.
Balanceado completo
8
/ \
/
\
/
\
/
\
/
\
/
\
/
\
4
12
/ \
/ \
/
\
/
\
/
\
/
\
2
6
10
14
/ \
/ \
/ \
/ \
1
3
5
7
9 11
13 15
Iterativo
Recursivo
15
/
14
/
12
/ \
8 13
/ \
/
\
/
\
4
10
/ \
/ \
/
\
9 11
/
\
2
6
/ \
/ \
1
3
5
7
15
/
8
/ \
/
\
/
\
/
\
/
\
/
\
/
\
4
12
/ \
/ \
/
\
/
\
/
\
/
\
2
6
10
14
/ \
/ \
/ \
/
1
3
5
7
9 11
13
2. Se tiene una tabla de hash abierto:
a) Si se cambia el tamaño de la tabla, es necesario cambiar la función de hash, dar razones.
20 puntos.
b) Si la función de hash es: f(x) = (3x+5)%11, indicar para los siguientes valores de la clave x,
cuáles elementos colisionan entre sí. Valores de clave = {5, 9, 11, 20}.
20 puntos.
c) Qué dificultades visualiza, en el diseño de las operaciones, si la función insertar acepta
incorporar elementos repetidos. Efectué un análisis para cada operación sobre la tabla.
20 puntos.
d) Explicar si encuentra o no razonable lo siguiente: “Si una entrada de una tabla de hash presenta
una lista de colisiones con más de cuatro elementos, debe evitarse insertar nuevos elementos en esa
entrada”.
20 puntos.
e) ¿Pueden o no almacenarse claves con valores negativos?. La función de hash debe cumplir
alguna restricción para estos casos.
20 puntos.
Solución.
a) Las funciones de hash deben generar números entre 0 y B-1, donde B es el número de entradas de
la tabla de punteros. Por lo tanto si cambia B, el tamaño de la tabla, también debe modificarse la
función para que genere números entre 0 y el nuevo tamaño de la tabla.
b) f(5) =9, f(9)=10, f(11)=5, f(20)=10. Los elementos con claves 9 y 20 generan el mismo valor de
hash, y por lo tanto colisionan entre sí.
c) La operación insertar al inicio de la tabla, permanece de complejidad O(1), sin embargo se alarga
la lista de colisiones.
La operación buscar es menos eficiente, debido a que se tendrán largos mayores en las listas de
colisiones.
Descartar se ve afectada, ya que antes de descartar debe buscar el elemento. Más aumenta la
complejidad si en el diseño se considera descartar todas las ocurrencias de la clave.
d) Al acotar el número de colisiones se limita fuertemente la estructura para buscar elementos.
Perdería su principal funcionalidad.
e) Pueden almacenarse números con claves con valores negativos; la función de hash, debe generar
solamente números positivos, entre 0 y el tamaño de la tabla.
Descargar