TABLAS DE DISPERSIÓN (HASH). TABLAS ENCADENADAS INDIRECTAS.

Slides:



Advertisements
Presentaciones similares
TDA LISTA ESTRUCTURAS DE DATOS.
Advertisements

Unidad 5 Listas Enlazadas Bibliografía: Algoritmos y Estructuras de datos de Aguilar y Martinez. Unidad 9 Autor: Ing Rolando Simon Titiosky.
Listas enlazadas c++ Prof. Franklin Cedeño.
Tipos de Datos Abstractos (III) Clase #23 Introducción a la Programación.
Programación II Listas
Estructuras de datos y algoritmos
Type tipo_bf = ; tipo_dato = word; tipo_puntero = ^tipo_nodo; tipo_nodo = record dato: tipo_dato; izquierdo, derecho: tipo_puntero; bf: tipo_bf;
Utilización de un TAD Arbol.
Paricial IV Ing. Esmeralda Elizabeth Rodríguez Rodríguez
A partir del lenguaje C Entorno de programación Visual C++
MANEJO DE EXCEPCIONES EN C++
POO en C++: Sintaxis En el .h debe aparecer la declaración de la clase: class NombreClase { private: // atributos y métodos privados public: // atributos.
9A9A9A9A Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Luis Hernández Yáñez Facultad de Informática.
INFORMATICA I Funciones CLASE 13.
Tema 5 Grafos..
Tema 5 Grafos. Implementación (I)..
Árboles binarios. Algoritmos básicos
Tema 4 Árboles. Árbol sobre matriz.
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO
Informática II 1 Diego Fernando Serna RestrepoSemestre 2011/2.
Abstracción de Datos La abstracción es un recurso fundamental en la programación orientada a objetos y está además fuertemente ligado a reusabilidad.
Implementación de Listas
Programación II Colas Igor Santos Grueiro.
Oscar Bedoya. Edificio 331, 2º piso, E.I.S.C. Estructuras de datos y algoritmos.
Genericidad Los datos de aplicaciones muy diferentes puede modelarse con frecuencia a partir de tipos de datos cuyas operaciones no dependen del tipo de.
Método en Java.
0. Desarrollo de Programas: técnica del refinamiento.
L ISTAS E NLAZADAS No son mas que un conjunto o lista de objetos que a diferencia de los vectores, estas poseen la capacidad de crecer o decrecer. Por.
Estructuras dinámicas de datos, TAD Lista, parte 2
Igor Santos Grueiro. De este tipo de pilas NO vamos a hablar.
ÁRBOLES BINARIOS DE BÚSQUEDA
C++ LISTAS C++ 11/04/2017 Ing. Edgar Ruiz Lizama.
3.  Recursividad.
Estructuras de Datos Arreglos.
Árboles binarios de búsqueda
Introducción a los punteros Prof. Domingo Hernández.
Árboles Binarios Estructuras de Datos.
LISTA DOBLEMENTE ENLAZADA
Dinamismo y Contenedores Facultad de Ciencias Exactas y Naturales Universidad de Buenos Aires (C++ Avanzado) Depto. de Computación Algoritmos y Estructuras.
Grafos..
1 Miembros Estáticos (Static) de Clases y Funciones Amigas (Friend) Agustín J. González ELO329.
1 Miembros Estáticos (Static) de Clases y Funciones Amigas (Friend) Agustín J. González Versión Original de Kip Irvine ELO326: Seminario II 2do. Sem
1 Miembros Estáticos (Static) de Clases y Funciones Amigas (Friend) Agustín J. González Versión Original de Kip Irvine ELO329.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Tabla.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Colección.
1 Asignación Dinámica de Memoria Agustín J. González ELO 329.
Estructuras de datos Fundamentos de análisis y diseño de algoritmos.
Algoritmos y Estructuras de datos Listas Doblemente enlazadas
Entrada y Salida ES.leerChar (); ES.leerEntero (); ES.leerEnteroLargo (); ES.leerFloat (); ES.leerDouble (); System.out.print System.out.println.
1 Miembros Estáticos (Static) de Clases y Funciones Amigas (Friend)‏ Agustín J. González ELO329.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Caso.
Ing. Esp. Ricardo Cujar.  Lenguaje de programación orientado a objetos.  Desarrollado por Sun MicroSystems.  Independiente del Sistema Operativo gracias.
Estructura de Datos..
Listas. Utilización de un TAD Lista. Interfaz del TAD LISTA public interface Lista { void crearNodo (); /*Crea un nuevo nodo en el TadLista*/ int devolverClave.
Introducción a la Programación Orientada a Objetos Arreglos de 2 dimensiones TDA Matriz Implementar un TDA Matriz que brinde operaciones para calcular.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Caso.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Tipo.
Desarrollador Profesional de Juegos Programación III Unidad I El manejador universal.
Ing. Esp. Ricardo Cujar. Permite la ejecución de una sentencia, dada una determinada condición. If(condición){ sentencia(s) a ejecutar en caso de que.
Ejemplo Animales. Clase 1 Animal miVelocidad: int miNombre: String Animal(int vel, String nom) saluda (): void.
Listas Dinámicas.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Arreglo.
1 ListaUna Lista se define como una serie de N elementos E 1, E 2,..., E N, ordenados de manera consecutiva, es decir, el elemento E k (que se denomina.
1 Métodos. 2 Un método es un conjunto de instrucciones definidas dentro de una clase, que realizan una determinada tarea y a las que podemos invocar mediante.
LICETH CAJAS 3RO ASI 26/10/2010. Es un lenguaje de programación diseñado para crear una amplia gama de aplicaciones que se ejecutan en.NET Framework,
Implementación de Iterables Construcción de Iterables virtuales o basados en otros iterables Fundamentos de Programación Departamento de Lenguajes y Sistemas.
UNIVERSIDAD DIEGO PORTALES Facultad de Ingeniería Programación Avanzada TIPOS ABSTRACTOS DE DATOS TAD Tema: TIPOS ABSTRACTOS DE DATOS TAD Subtema: COLAS.
Árboles binarios. Algoritmos básicos
Programación Gráfica 5. Introducción a C++..
Casos de prueba con JUnit
Transcripción de la presentación:

TABLAS DE DISPERSIÓN (HASH)

TABLAS ENCADENADAS INDIRECTAS

class EClaveErronea { }; template class TTablaAbierta; template class TNodoTabla { private: TClave _clave; TValor _valor; TNodoTabla *_sig; TNodoTabla( const TClave&, const TValor&, TNodoTabla * ); public: const TClave& clave() const; const TValor& valor() const; TNodoTabla * sig() const; friend TTablaAbierta ; };

template class TTablaAbierta { public: TTablaAbierta( ); TTablaAbierta( const TTablaAbierta & ); ~TTablaAbierta( ); TTablaAbierta & operator=( const TTablaAbierta & ); void inserta( const TClave&, const TValor& ); void borra( const TClave& ); const TValor& consulta( const TClave& ) const throw (EClaveErronea); bool esta( const TClave& ) const; bool esVacio( ) const; void escribe( ostream& salida ) const;

private: static const int longMax = 10; TNodoTabla * _espacio[longMax]; void libera(); void copia( const TTablaAbierta & ); //FUNCIÓN HASH int localiza( const TClave&) const; void busca ( const TClave&, TNodoTabla * &, TNodoTabla * & ) const; };

template TNodoTabla ::TNodoTabla( const TClave& clave, const TValor& valor, TNodoTabla * sig = 0 ) : _clave(clave), _valor(valor), _sig(sig) { }; template const TClave& TNodoTabla ::clave() const { return _clave; } template const TValor& TNodoTabla ::valor() const { return _valor; } template TNodoTabla * TNodoTabla ::sig() const { return _sig; }

template TTablaAbierta ::TTablaAbierta( ) { for ( int i = 0; i < longMax; i++ ) _espacio[i] = 0; }; template void TTablaAbierta ::busca( const TClave& clave, TNodoTabla * & act, TNodoTabla * & ant ) const { bool encontrado = false; ant = 0; while ((! encontrado) && (act != 0) ) { encontrado = clave == act->clave(); if ( ! encontrado ) { ant = act; act = act->sig(); } };

template int TTablaAbierta ::localiza( const TClave& clave) const { return clave.num() % longMax; }; template void TTablaAbierta ::inserta( const TClave& clave, const TValor& valor ) { int i; TNodoTabla *act, *ant; i = localiza( clave ); act = _espacio[i]; busca( clave, act, ant ); if ( act != 0 ) act->_valor = valor; else {//si no esta se inserta al principio act = new TNodoTabla (clave, valor, _espacio[i]); _espacio[i] = act; } };

template void TTablaAbierta ::borra( const TClave& clave ) { int i; TNodoTabla *act, *ant; i = localiza(clave); act = _espacio[i]; busca( clave, act, ant ); if ( act != 0 ) { if ( ant != 0 ) ant->_sig = act->sig(); else //estamos borrando el primero _espacio[i] = act->sig(); delete act; } };

template const TValor& TTablaAbierta ::consulta( const TClave& clave ) const throw (EClaveErronea) { int i; TNodoTabla *act, *ant; i = localiza(clave); act = _espacio[i]; busca( clave, act, ant ); if ( act == 0 ) throw EClaveErronea(); return act->valor(); };

template bool TTablaAbierta ::esta( const TClave& clave ) const { int i; TNodoTabla *act, *ant; i = localiza(clave); act = _espacio[i]; busca( clave, act, ant ); return act != 0; }; template bool TTablaAbierta ::esVacio( ) const { int i = 0; bool vacio = true; while ( vacio && (i < longMax) ) { vacio = _espacio[i] == 0; i++; } return vacio; };

TABLAS DE DIRECCIONAMIENTO ABIERTO (redispersión doble)

class EClaveErronea { }; class EDesbordamiento { }; template class TTablaCerrada; enum TPosicion {vacia, ocupada, borrada}; template class TNodoTabla { private: TClave _clave; TValor _valor; TPosicion _posicion; TNodoTabla( );

public: const TClave& clave() const; const TValor& valor() const; const TPosicion& posicion() const; friend TTablaCerrada ; }; template class TTablaCerrada { public: TTablaCerrada( ); TTablaCerrada( const TTablaCerrada & ); ~TTablaCerrada( ); TTablaCerrada & operator=( const TTablaCerrada & );

void inserta( const TClave&, const TValor& ); void borra( const TClave& ); const TValor& consulta( const TClave& ) const throw (EClaveErronea); bool esta( const TClave& ) const; bool esVacio( ) const; void escribe( ostream& salida ) const; private: static const int longMax = 23; // se recomienda primo > 20 TNodoTabla _espacio[longMax]; void libera(); void copia( const TTablaCerrada & ); int busca ( const TClave& ) const; };

template TNodoTabla ::TNodoTabla( ) : _posicion(vacia) { }; template const TClave& TNodoTabla ::clave() const { return _clave; } template const TValor& TNodoTabla ::valor() const { return _valor; } template const TPosicion& TNodoTabla ::posicion() const { return _posicion; }

template TTablaCerrada ::TTablaCerrada( ) { for ( int i = 0; i < longMax; i++ ) _espacio[i]._posicion = vacia; }; template int TTablaCerrada ::busca( const TClave& clave ) const { int i, n, d, m; bool encontrado; n = clave.num(); i = n % longMax; d = (n % (longMax-2)) + 1; m = 0; //contabiliza el número de pruebas por si la tabla está llena encontrado = false; while ( (! encontrado) && (_espacio[i].posicion() != vacia) && (m < longMax) ) { if ( _espacio[i]._posicion == ocupada ) encontrado = clave == _espacio[i].clave(); if ( ! encontrado ) { m++; i = (i + d) % longMax; } } if ( ! encontrado ) { i = longMax; }; return i; };

template void TTablaCerrada ::borra( const TClave& clave ) { int i = busca(clave); if ( i != longMax ) _espacio[i]._posicion = borrada; }; template const TValor& TTablaCerrada ::consulta( const TClave& clave ) const throw (EClaveErronea) { int i = busca(clave); if ( i == longMax ) throw EClaveErronea(); return _espacio[i].valor(); }; template bool TTablaCerrada ::esta( const TClave& clave ) const { int i = busca(clave); return i != longMax; };

template void TTablaCerrada ::inserta( const TClave& clave, const TValor& valor ) { int i, n, d, m; bool encontrado; n = clave.num(); i = n % longMax; d = (n % (longMax-2)) + 1; m = 0; //contabiliza el número de pruebas por si la tabla está llena encontrado = false; while ( ( ! encontrado ) && (_espacio[i].posicion() == ocupada) && (m < longMax) ) { if ( _espacio[i]._posicion == ocupada ) encontrado = clave == _espacio[i].clave(); if ( ! encontrado ) { m++; i = (i + d) % longMax; }

if ( m == longMax ) throw EDesbordamiento(); else if ( encontrado ) _espacio[i]._valor = valor; else if ( _espacio[i].posicion() == vacia ) {_espacio[i]._clave = clave; _espacio[i]._valor = valor; _espacio[i]._posicion = ocupada; } else if ( _espacio[i].posicion() == borrada ) { _espacio[i]._clave = clave; _espacio[i]._valor = valor; _espacio[i]._posicion = ocupada; m++; i = (i + d) % longMax; while ( ( ! encontrado ) && (_espacio[i].posicion() != vacia) && (m < longMax) ) { if ( _espacio[i].posicion() == ocupada ) encontrado = clave == _espacio[i].clave(); if ( ! encontrado ) { m++; i = (i + d) % longMax; } } if ( encontrado ) {_espacio[i]._posicion = borrada;}; } };

template bool TTablaCerrada ::esVacio( ) const { int i = 0; bool vacio = true; while ( vacio && (i < longMax) ) { vacio = _espacio[i].posicion() != ocupada; i++; } return vacio; }; template void TTablaCerrada ::escribe( ostream& salida ) const { for ( int i = 0; i < longMax; i++ ) { salida << i << ":"; if ( _espacio[i].posicion() == ocupada ) salida << "(" << _espacio[i].clave() << ", " << _espacio[i].valor()<< ")"; else if ( _espacio[i].posicion() == borrada ) salida << "###"; salida << endl; } };