Professional Documents
Culture Documents
Arboles Generalidades Arbol: Conjunto de elementos llamadas nodos, este conjunto puede estar vacio o sino esta vacio contiene un nodo distinguido r llamada raiz del arbol y cero o mas subrboles Ar,....AR, cuyas raices estan conectadas por medio de una arista o rama dirigida.
T. D. A. rbol Definicin recursiva de rbol
Sean T1,...., Tk arboles con races n1, n2, ....., nk respectivamente. Sea el n nodo, si unimos n a los nodos n1, n2,...., nk obtenemos un nico rbol T de raz n.
T1,...., Tk son subarboles de n. Los nodos n1, n2,...., nk son descendientes directos de n; (o hijos ). En general si x es un nodo que ocupa el nivel i, sus descendiente directo ocupan el nivel i + 1.
Tipos de Representacin
Se pueden representar los arboles de dos formas a travs de punteros o con cursor
rbol binario
De ahora en mas trabajaremos con arboles de grado dos o binario Definicin: un rbol binario es aquel que es un rbol vaco o en el que cada nodo tiene ningn hijo, un hijo o 2 hijos. 1
J.L.R.R Por definicin un nodo sin descendiente se lo llama hoja o nodo terminal los que tiene uno o dos descendientes, nodos internos o no terminales.
rbol Ordenado
Un rbol es ordenado cuando para cada nodo existe un orden en sus subarboles
DISTINTO DE Un rbol ordenado no siempre ser binario al igual que un binario no ser ordenado. Al trabajar este TDA uno de los objetivo es minimizar la cantidad mxima de comparaciones al buscar elementos, para ello de ahora en mas trabajaremos con rbol binario ordenado de bsqueda. Dato Objeto
Type punt = ^nodo; nodo = Record info : tipo_informacion; cont : integer; izq : punt; der : punt; end; var raiz : punt; Procedure insertar (var xp:punt; xx:info); begin if xp = nil then begin new (xp); xp^.info := xx; xp^.izq := nil; xp^.der := nil; end; else if xx > xp^.info then insertar(xp^.der, xx) else if xx < xp^.info then insertar (xp^.izq,xx) else inc (xp^.cont); end; Procedure crear (var xp:punt); begin xp:=nil; end;
Procedure inorden (xp:punt); begin if xp <> nil then begin inorden (xp^.izq); writeln (xp^.info); inorden (xp^.der); end; end;
J.L.R.R dato objeto Type balance = -1..1; punt = ^nodo; nodo = Record info : tipo_informacion; cont : integer; bal : balance; izq : punt; der : punt; end; Al pretender mantener un rbol equilibrado o balanceado el caso mas complicado (caso 2) es el siguiente: Aquel nodo que arroja desbalanceo se lo reemplaza por el mayor de sus menores (creci la rama izquierda) o el menor de sus mayores (creci la rama derecha). El caso mas simple (caso 1) el nodo que arroja desequilibrio se lo reemplaza por su hijo izquierdo (creci la rama izquierda) o por sus hijo derecho (si creci la rama derecha). CASO 1
SOLUCIN
SOLUCIN EJEMPLO
SOLUCIN
J.L.R.R CASO 2
SOLUCIN
SOLUCIN EJEMPLO
SOLUCIN
J.L.R.R
type punt : ^pagina; pagina = Record po : punt; puntero m : integer; numero de elementos claves : array [1.. 2 * n] of item; end; item = Record k : integer; dato cualquiera p : punt; puntero cont : integer; contador end; Como vamos de mayor a menor a menor en cada pagina vemos que cada puntero apunta a otra pagina que contiene las claves mayores de donde l a salido y menores que las claves que estn a la derecha. po apunta a la pagina que contiene todas las claves menores que K1 y el puntero que acompaa a Km apunta a una pagina que contiene todas las claves mayores que a Km.
J.L.R.R
J.L.R.R
Hashing
La mayora de los problemas que se nos presenta tienen los siguientes inconvenientes, conocemos aproximadamente los valores en cuanto a su cardinalidad y adems solo conocemos limite inferior y superior del mismo el ejemplo a citar seria los DNI de los alumnos de segundo y tercer ao. Supongamos tener como limite inferior y superior a 20 millones y 25 millones y los alumnos de ambos grupos no suman mas de 150. Seria imposible reservar espacio de memoria para almacenar el milln de datos cuando en realidad sera suficiente 200 entradas a la tabla. De esta forma sacrificamos la biyeccin y trabajamos con la sobreyectividad esto implica que dos claves diferentes pretendan ocupar el mismo lugar de memoria, cuando se produce esta situacin diremos que se a registrado una colisin o que K1 y K2 son colisionantes o K1 y K2 son sinnimos porque pretenden ocupara un mismo lugar. Hashing trabaja de la siguiente forma: citada una clave K aplicamos una funcin hash H y obtenemos como resultado una entrada D que es la ubicacin en la tabla que pretende ocupar. inyectiva K1 K2 H (K1 ) H (K2 ) biyectiva x d D k K / H (K) = D H : K ------> D K = { ki / 000 <= ki <= 999} D = { di / 000 <= di <= 999}
1) Eleccin de la funcin hash (H) Divisin H (K) = K mod M M tamao de la tabla en lo posible M primo Plegado K = d8 d7 | d6 d5 d4 | d3 d2 d1 + d8 d7 d6 d5 d4 d3 d2 d1 direccin
Extraccin Extraer los dgitos que varan mas aleatoriamente Cuadrado medio H (K) = K2 extraer dgitos centrales Claves alfanumricas K= C3 C2 C1 C= carcter H (K) = ord (C3) + ord (C2) + ord (C1) mejora H (K) = ord (C3) * b + ord (C2) * b2 + ord (C1) * b3 Es principal problema es la colisin y para ello existen polticas de trato de las mismas, se podran dividir dos grandes grupos las cuales son Hashing Abierto y Hashing Cerrado. Hashing Abierto Encadenamiento Hashing Cerrado Uso de Buckets Hashing Cerrado Direccionamiento Abierto
J.L.R.R
La tcnica de encadenamiento se trata en mantener M cabezas de listas de sinnimos. La ventaja de la tcnica de encadenamiento es que el crecimiento de esas listas de sinnimos es ilimitada. Cabe citar que un numero primo minimiza las colisiones mas de dos colisiones no hay.
J.L.R.R Una buena funcin hash (h), en un contexto particular, ser aquella que minimice las colisiones en dicho contexto. En la medida de lo posible, es altamente recomendable experimentar con diversas funciones, antes de escoger una. La seleccin de una funcin hash estar influida por las respuestas que se de a las siguientes consideraciones. Puede escogerse la funcin hash para ajustarla a los registros a procesar? La respuesta a esta pregunta no siempre es afirmativa. Por ejemplo, si se usara loa funcin hash para la tabla de smbolos de un compilador o un ensamblador, la respuesta seria negativa, ya que no sabemos que identificadores encontraremos. Por otro lado, en un banco de datos, es conocido el formato de las claves ( e incluso en muchas ocasiones las propias claves). Importa el tiempo empleado en calcular la funcin hash? Si los registros se encuentran en memoria secundaria, la respuesta bien puede ser no, en especial si los tiempos de acceso son relativamente altos. En estos casos, se desea una funcin que minimice el numero de accesos, independientemente del tiempo que lleve calcularla. Por otro lado, para tablas que residen en memoria principal no tendr sentido minimizar el numero de accesos. Con que instrucciones se cuenta para calcular la funcin hash? Algunas funciones requieren manipular los bits de la clave, lo que no es fcil hacer en algunos lenguajes de alto nivel. Otras requieren el uso de funciones, como la raz cuadrada, no siempre disponibles. Cual es la longitud de las claves? Si las claves tienen mas de una palabra de longitud, puede ser conveniente realizar un preproceso con ellas, como por ejemplo sumar las palabras que la componen, antes de calcular la funcin hash Puede escogerse el tamao de la tabla y la forma de las direcciones que se usaran? Si este es el caso, ser posible escoger una tabla cuyo tamao sea potencia de dos (o de diez), lo cual es requerido por ciertos mtodos. Se encuentra las claves distribuidas en alguna forma aproximadamente aleatoria? Generalmente, las claves tendrn una distribucin casi uniforme; sin embargo, es posible mostrar que algunas funciones de hash tienden a crear sinnimos para una coleccin amplia de llaves. Por otro lado, si la distribucin de las claves es conocida, se pueden utilizar funciones hash adecuadas para obtener una mejor distribucin de direcciones.