def rehash(map):
    """
    Se aumenta la capacidad de la tabla al doble y se hace rehash de
    todos los elementos de la tabla.
    """
    try:
        newtable = lt.newList('ARRAY_LIST', map['comparefunction'])

        capacity = nextPrime(map['capacity'] * 2)

        for _ in range(capacity):
            entry = me.newMapEntry(None, None)
            lt.addLast(newtable, entry)
        oldtable = map['table']
        map['size'] = 0
        map['currentfactor'] = 0
        map['table'] = newtable
        map['capacity'] = capacity
        for pos in range(lt.size(oldtable)):

            entry = lt.getElement(oldtable, pos + 1)

            if (entry['key'] is not None and entry['key'] != '__EMPTY__'):
                hash = hashValue(map, entry['key'])
                pos = findSlot(map, entry['key'], hash, map['comparefunction'])
                lt.changeInfo(map['table'], abs(pos), entry)
                if (pos < 0):
                    map['size'] += 1
                    map['currentfactor'] = map['size'] / map['capacity']
        return map
    except Exception as exp:
        error.reraise(exp, 'Probe:rehash')
def put(map, key, value):
    """ Ingresa una pareja llave,valor a la tabla de hash.
    Si la llave ya existe en la tabla, se reemplaza el valor

    Args:
        map: El map a donde se guarda la pareja
        key: la llave asociada a la pareja
        value: el valor asociado a la pareja
    Returns:
        El map
    Raises:
        Exception
    """
    try:

        hash = hashValue(map, key)  # Se obtiene el hascode de la llave
        entry = me.newMapEntry(key, value)
        pos = findSlot(map, key, hash, map['comparefunction'])
        lt.changeInfo(map['table'], abs(pos), entry)
        if (pos < 0):  # Se reemplaza el valor con el nuevo valor

            map['size'] += 1
            map['currentfactor'] = map['size'] / map['capacity']

        if (map['currentfactor'] >= map['limitfactor']):
            rehash(map)
        return map
    except Exception as exp:
        error.reraise(exp, 'Probe:put')
def put(map, key, value):
    """ Ingresa una pareja llave,valor a la tabla de hash.
    Si la llave ya existe en la tabla, se reemplaza el valor

    Args:
        map: El map a donde se guarda la pareja
        key: la llave asociada a la pareja
        value: el valor asociado a la pareja
    Returns:
        El map
    Raises:
        Exception
    """
    try:
        hash = hashValue(map, key)
        bucket = lt.getElement(map['table'], hash)
        entry = me.newMapEntry(key, value)
        pos = lt.isPresent(bucket, key)
        if pos > 0:  # La pareja ya exista, se reemplaza el valor
            lt.changeInfo(bucket, pos, entry)
        else:
            lt.addLast(bucket, entry)  # La llave no existia
            map['size'] += 1
            map['currentfactor'] = map['size'] / map['capacity']

        if (map['currentfactor'] >= map['limitfactor']):
            rehash(map)

        return map
    except Exception as exp:
        error.reraise(exp, 'Chain:put')
Exemple #4
0
def put(map, key, value):
    """ Ingresa una pareja llave,valor a la tabla de hash.
    Si la llave ya existe en la tabla, se reemplaza el valor

    Args:
        map: El map a donde se guarda la pareja
        key: la llave asociada a la pareja
        value: el valor asociado a la pareja
    Returns:
        El map
    Raises:
        Exception
    """
    if map['ints']:
        hashv = key % map['capacity']
    else:
        hashv = hashValue(map, key)
    bucket = lt.getElement(map['table'], hashv)
    entry = me.newMapEntry(key, value)
    pos = lt.isPresent(bucket, key)
    if pos > 0:    # La pareja ya exista, se reemplaza el valor
        lt.changeInfo(bucket, pos, entry)
    else:
        lt.addLast(bucket, entry)   # La llave no existia
        map['size'] += 1
    return map
def rehash(map):
    """
    Se aumenta la capacidad de la tabla al doble y se hace rehash de
    todos los elementos de la tabla.
    """
    try:
        newtable = lt.newList("ARRAY_LIST", map["comparefunction"])
        capacity = nextPrime(map["capacity"] * 2)
        for _ in range(capacity):
            entry = me.newMapEntry(None, None)
            lt.addLast(newtable, entry)
        oldtable = map["table"]
        map["size"] = 0
        map["currentfactor"] = 0
        map["table"] = newtable
        map["capacity"] = capacity
        for pos in range(lt.size(oldtable)):
            entry = lt.getElement(oldtable, pos + 1)
            if entry["key"] is not None and entry["key"] != "__EMPTY__":
                hash = hashValue(map, entry["key"])
                pos = findSlot(map, entry["key"], hash, map["comparefunction"])
                lt.changeInfo(map["table"], abs(pos), entry)
                if pos < 0:
                    map["size"] += 1
                    map["currentfactor"] = map["size"] / map["capacity"]
        return map
    except Exception as exp:
        error.reraise(exp, "Probe:rehash")
def newMap(numelements, prime, loadfactor, comparefunction):
    """Crea una tabla de simbolos (map) sin orden

    Crea una tabla de hash con capacidad igual a nuelements
    (primo mas cercano al doble de numelements).
    prime es un número primo utilizado para  el cálculo de los codigos
    de hash, si no es provisto se  utiliza el primo 109345121.

    Args:
        numelements: Tamaño inicial de la tabla
        prime: Número primo utilizado en la función MAD
        loadfactor: Factor de carga inicial de la tabla
        comparefunction: Funcion de comparación entre llaves
    Returns:
        Un nuevo map
    Raises:
        Exception
    """
    capacity = nextPrime(numelements//loadfactor)
    scale = rd.randint(1, prime-1) + 1
    shift = rd.randint(1, prime)
    table = lt.newList('ARRAY_LIST', comparefunction)
    for _ in range(capacity):
        entry = me.newMapEntry(None, None)
        lt.addLast(table, entry)
    hashtable = {'prime': prime,
                 'capacity': capacity,
                 'scale': scale,
                 'shift': shift,
                 'table': table,
                 'comparefunction': comparefunction,
                 'size': 0,
                 'type': 'PROBING'}
    return hashtable
Exemple #7
0
def newMap(numelements, prime, loadfactor, comparefunction, datastructure):
    """Crea una tabla de simbolos (map) sin orden

    Crea una tabla de hash con capacidad igual a nuelements
    (primo mas cercano al doble de numelements).
    prime es un número primo utilizado para  el cálculo de los codigos
    de hash, si no es provisto se  utiliza el primo 109345121.

    Args:
        numelements: Tamaño inicial de la tabla
        prime: Número primo utilizado en la función MAD
        loadfactor: Factor de carga maximo de la tabla
        comparefunction: Funcion de comparación entre llaves
        datastructure: estructura de datos seleccionada
    Returns:
        Un nuevo map
    Raises:
        Exception
    """
    try:
        capacity = nextPrime(numelements//loadfactor)
        scale = rd.randint(1, prime-1)
        shift = rd.randint(0, prime-1)
        hashtable = {'prime': prime,
                     'capacity': capacity,
                     'scale': scale,
                     'shift': shift,
                     'table': None,
                     'currentfactor': 0,
                     'limitfactor': loadfactor,
                     'comparefunction': None,
                     'size': 0,
                     'type': 'PROBING',
                     'datastructure': datastructure}
        if(comparefunction is None):
            cmpfunc = defaultcompare
        else:
            cmpfunc = comparefunction
        hashtable['comparefunction'] = cmpfunc
        hashtable['table'] = lt.newList(datastructure='ARRAY_LIST',
                                        cmpfunction=cmpfunc)
        for _ in range(capacity):
            entry = me.newMapEntry(None, None)
            lt.addLast(hashtable['table'], entry)
        return hashtable
    except Exception as exp:
        error.reraise(exp, 'Probe:newMap')
Exemple #8
0
def remove(map, key):
    """ Elimina la pareja llave,valor, donde llave == key.
    Args:
        map: El map a donde se guarda la pareja
        key: la llave asociada a la pareja

    Returns:
        El map
    Raises:
        Exception
    """
    hash = hashValue(map, key)
    pos = findSlot(map, key, hash, map['comparefunction'])
    if pos > 0:
        entry = me.newMapEntry('__EMPTY__', '__EMPTY__')
        lt.changeInfo(map['table'], pos, entry)
        map['size'] -= 1
    return map
Exemple #9
0
def put(map, key, value):
    """ Ingresa una pareja llave,valor a la tabla de hash.
    Si la llave ya existe en la tabla, se reemplaza el valor

    Args:
        map: El map a donde se guarda la pareja
        key: la llave asociada a la pareja
        value: el valor asociado a la pareja
    Returns:
        El map
    Raises:
        Exception
    """
    hash = hashValue(map, key)  # Se obtiene el hascode de la llave
    entry = me.newMapEntry(key, value)
    pos = findSlot(map, key, hash, map['comparefunction'])
    lt.changeInfo(map['table'], abs(pos), entry)
    if (pos < 0):  # Se reemplaza el valor con el nuevo valor
        map['size'] += 1
    return map
def newMap(numelements, prime, loadfactor, comparefunction):
    """Crea una tabla de simbolos (map) sin orden

    Crea una tabla de hash con capacidad igual a nuelements
    (primo mas cercano al doble de numelements).
    prime es un número primo utilizado para  el cálculo de los codigos
    de hash, si no es provisto se  utiliza el primo 109345121.

    Args:
        numelements: Tamaño inicial de la tabla
        prime: Número primo utilizado en la función MAD
        loadfactor: Factor de carga maximo de la tabla
        comparefunction: Funcion de comparación entre llaves
    Returns:
        Un nuevo map
    Raises:
        Exception
    """
    try:
        capacity = nextPrime(numelements // loadfactor)
        scale = rd.randint(1, prime - 1) + 1
        shift = rd.randint(1, prime)
        table = lt.newList("ARRAY_LIST", comparefunction)
        for _ in range(capacity):
            entry = me.newMapEntry(None, None)
            lt.addLast(table, entry)
        hashtable = {
            "prime": prime,
            "capacity": capacity,
            "scale": scale,
            "shift": shift,
            "table": table,
            "currentfactor": 0,
            "limitfactor": loadfactor,
            "comparefunction": comparefunction,
            "size": 0,
            "type": "PROBING",
        }
        return hashtable
    except Exception as exp:
        error.reraise(exp, "Probe:newMap")
def remove(map, key):
    """Elimina la pareja llave,valor, donde llave == key.
    Args:
        map: El map a donde se guarda la pareja
        key: la llave asociada a la pareja

    Returns:
        El map
    Raises:
        Exception
    """
    try:
        hash = hashValue(map, key)
        pos = findSlot(map, key, hash, map["comparefunction"])
        if pos > 0:
            entry = me.newMapEntry("__EMPTY__", "__EMPTY__")
            lt.changeInfo(map["table"], pos, entry)
            map["size"] -= 1
        return map
    except Exception as exp:
        error.reraise(exp, "Probe:remove")
Exemple #12
0
def newCategory(name, id):
    category = me.newMapEntry(name.strip().lower(), id)
    return category
Exemple #13
0
def crearParejaCatalogo(key, value):
    return me.newMapEntry(key, value)