230 likes | 455 Vues
Elaboració d'una eina didàctica en JAVA per tal d'estudiar l'estructura de dades “taula” implementada com a “ hash”. David Colomina Badia Director: Josep Maria Ribó Balust Setembre 2000. Índex. Fonaments Funcions de dispersió Estratègies de dispersió Implementació
E N D
Elaboració d'una eina didàctica en JAVA per tal d'estudiar l'estructura de dades “taula” implementada com a “hash” David Colomina Badia Director: Josep Maria Ribó Balust Setembre 2000
Índex • Fonaments • Funcions de dispersió • Estratègies de dispersió • Implementació • Conclusions - Treball futur
Fonaments • Tipus d’accessos • Les taules com e.d. per implementar l’accés per contingut • TAD Taula: Operacions, especificació • Estratègies d’implementació
Tipus d’accessos • Accés seqüencial Inserció de dades: Una darrera de l’altra Consultem les dades: Una darrera de l’altra fins trobar-les Eficiència: O(n) on n és el nombre d’elements emmagatzemats Cost elevat si les dades poden tenir un volum gran • Accés per contingut Consulta: Obtindrem l’element a partir d’un fragment del contingut d’aquest. (Clau) Eficiència:(O(1) o O(log(n)) on n és el nombre d’elements emmagatzemats
ED Taula: accés per contingut • Idea: Taula cjt de parelles <clau,valor> <k,v> • Clau és identificadora • Consultes Eficients: Cost O(1), O(log n) És l’operació destacada (Consulta (k) v) • Les taules es poden modelitzar com funcions on K : espai de claus o índexs o identificadors V : espai de valors o informació f(k) v • Existeixen altres tipus de taules amb clau no identificadora (multitaules)
TAD Taula: Operacions • Les operacions bàsiques de les taules són: • Crear ( ): Crea una taula buida sense cap parella <k,v> • Inserir(k,v): Inserim el parell <k,v> dins la taula, associant per la clau inserida el seu corresponent valor o informació. • Consultar (k) retorna v: Consultem el valor o la informació que té associada la clau dins la taula. • Eliminar (k): Eliminem el parell <k,v> de la taula.
TAD Taula: Especificació • Especificació algebraica TAD TAULA (T_CLAU , T_VALOR) és • Importa: • BOOL • Operacions: • CREAR ( ) TAULA • INSERIR ( TAULA , T_CLAU , T_VALOR ) TAULA • CONSULTAR ( TAULA , T_CLAU ) T_VALOR • ELIMINAR ( TAULA , T_CLAU ) TAULA • EXISTEIX (TAULA, T_CLAU) BOOL
TAD Taula: Especificació • Axiomes: 1. INSERIR ( INSERIR ( t , k1 , v1 ) , k2 , v2 ) = • si k1 = k2 INSERIR ( t , k1 , v2 ) • sinó INSERIR ( INSERIR ( t , k2 , v2 ) , k1 , v1 ) 2. CONSULTAR ( INSERIR ( t , k1 , v1 ) , k2 ) = • si k1 = k2 v1 • sinó CONSULTAR ( t , k2 ) 3. ELIMINAR ( INSERIR ( t , k1 , v1 ) , k2 ) = • si k1 = k2 t • sinó INSERIR ( ELIMINAR ( t , k2 ) , k1 , v1 )
TAD Taula: Especificació 4. EXISTEIX ( INSERIR ( t , k1 , v1 ) , k2 ) = • si k1 = k2 CERT • sinó EXISTEIX ( t , k2 ) 5. EXISTEIX ( CREAR( ) , k ) = FALS • Errors: 1. ELIMINAR ( CREAR( ) , k ) 2. CONSULTAR ( CREAR( ) , k ) 3. INSERIR ( t , k , ) • fi TAD
Estratègies d’implementació • Implementacions seqüencials • Llista • Vector • Implementacions arborescents • Arbres ABC • Arbres AVL • Arbres B+ • Funcions Injectives • Funcions no Injectives: Taules de dispersió • Arbres 2-3 • Arbres “Red-Black”
Funcions Injectives f és una funció injectiva que mapeja l’espai de claus a l’espai d’adreces.
Funcions Injectives • Implementació tant sols acceptable si es coneix la mida de l’espai de les claus (a priori) i aquesta no és molt elevada, i si es pot trobar una funció injectiva de cost baix. • Exemple: Emmagatzematge de les persones que ocupen l’habitació d’un hotel, on la clau seria el número de l’habitació i el valor seria les dades de la persona que l’ocupa. Tenim 40 habitacions per planta i 7 plantes. Les habitacions es numeren: 100-139; 200-239;...; 700-739 Una possible funció injectiva que tindríem seria: f(nh) = ((nh div 100) – 1)*40 + (nh mod 100) On clau = Número d’habitació (nh)
“Funcions de dispersió” “Estratègies de dispersió” Funcions no injectives: Taules de dispersió • Qüestions a resoldre: • Quina forma ha de prendre la funció de dispersió per ser prou “bona”? • Què fem amb les claus dispersades per h a la mateixa adreça?
Nomenclatura • B Capacitat de la taula (mida de l’espai d’adreces) • Claus sinònims ki, kj seran 2 claus sinònimes respecte una funció de dispersió h, si i només si, dins la taula, tenen la mateixa adreça assignada per h [h (ki) = h(kj)] • Col.lisions Es diu que es produeix una col.lisió, quan volem inserir a la taula 2 claus sinònimes. • Factor de càrrega % d’ocupació d’una taula. • Funció de dispersió o funció de hash(h) és la funció no injectiva que indueix una relació d’equivalència a l’espai de claus, i h(k) és l’adreça que se li assigna a la clau k.
Funcions de dispersió • Característiques: • Bona distribució de les claus (distribució uniforme) • Que pugui generar qualsevol adreça de l'espai d'adreces • Eficiència en el seu càlcul: cost O(1) • Dos consells pràctics: • La funció de hash ha d'involucrar tota la clau. • La funció de hash ha de tenir en compte l'ordre dels components de la clau.
Funcions de dispersió: Exemples (h) • Suma de tots els dígits • Funció fàcil de calcular i d’implementar • h(“abc”)=h(“bca”)=h(“cba”)=... • O(1), si |k| està fixada
Plegament de la clau en m parts de la mateixa longitud Funcions de dispersió: Exemples (h) • Suma ponderada de tots els dígits • b : nombre de caràcters possibles de k • Ineficient: Càlcul d’una potència • Sobreixement en el càlcul de la potència
Funcions de dispersió • Conclusions Per bona que sigui una funció de dispersió, és inherent a ella la existència de claus sinònimes i, per tant, col.lisions, es necessari resoldre aquest problema. Hi ha mètodes per realitzar-ho, que són els que veurem a continuació dins les “estratègies de hash”.
Encadenament o no de les col.lisions Estratègies de dispersió Les taules de dispersió poden organitzar-se de diverses maneres segons com es gestionen les col.lisions Possibles estratègies de dispersió: • Hash Tancat • Hash Obert • Taules Coalescents • Hash dinàmic
Famílies de redispersió • Redispersió lineal hi(k) = (h(k) + c·i) mod B • Redispersió quadràtica hi(k) = (h(k) +c·i2) mod B ; 0 i B-1 • Redispersió doble hi(k) = (h(k) + i·h’(k)) mod B
Conclusions • Hem estudiat l’estructura de dades taula. • Hem donat una especificació acurada, em estudiat diferents funcions de dispersió, diferents estratègies de dispersió de hash, diferents funcions de redispersió. • S’ha realitzat l’eina didàctica realitzant la pàgina Web i l’applet (on hi ha opció d’ajuda al context i d’ajuda de l’aplicació, exemples, gràfics, operacions hash, algorismes, execució pas a pas, possibilitat de definició de les variables,...) • Hem assolit gairebé tots els objectius plantejats en el treball. Ara queda, però, el més important i és que aquesta eina sigui realment d’utilitat als seus destinataris.
Treball futur • Realitzar la implementació del hash dinàmic, de les taules coalescents, altres funcions i estratègies de hash que puguin existir i que no s’hagin tractat en el treball. • Internacionalitzar l’eina didàctica. • Estudiar d’altres estratègies de hash dinàmic, hash tancat, hash obert que poden existir. • Donar els diferents algoritmes per les taules coalescents i pel hash dinàmic explicats en el treball. • Realitzar una comparativa de costos entre els tipus de hash que falten per veure i els que s’han vist. • Cercar noves funcions de dispersió i de redispersió, i realitzar una comparativa entre elles