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')
예제 #3
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 delMax(heap):
    """
    Retorna el menor elemento del heap y lo elimina.
    Se reemplaza con el último elemento y se hace sink.

    Args:
        heap: El arreglo con la informacion

    Returns:
        El menor elemento eliminado
    Raises:
        Exception
    """
    try:
        if (heap['size'] > 0):
            max = lt.getElement(heap['elements'], 1)
            last = lt.getElement(heap['elements'], heap['size'])
            lt.changeInfo(heap['elements'], 1, last)
            lt.changeInfo(heap['elements'], heap['size'], None)
            heap['size'] -= 1
            sink(heap, 1)
            return max
        return None
    except Exception as exp:
        error.reraise(exp, 'heap:delMax')
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")
예제 #6
0
def exchange(iheap, i, j):
    """
    Intercambia los elementos en las posiciones i y j del heap
    """
    try:
        element_i = lt.getElement(iheap['elements'], i)
        element_j = lt.getElement(iheap['elements'], j)
        lt.changeInfo(iheap['elements'], i, element_j)
        map.put(iheap['qpMap'], element_i['key'], j)
        lt.changeInfo(iheap['elements'], j, element_i)
        map.put(iheap['qpMap'], element_j['key'], i)
    except Exception as exp:
        error.reraise(exp, 'indexheap:exchange')
예제 #7
0
def changeInfo(lst, pos, element):
    """ Cambia la informacion contenida en el nodo de la lista que se encuentra en la posicion pos.
    
    Args:   
        lst: La lista a examinar
        pos: la posición de la lista con la información a cambiar
        newinfo: La nueva información que se debe poner en el nodo de la posición pos

    Raises:
        Exception
    """
    try:
        lt.changeInfo(lst, pos, element)
    except Exception as exp:
        error.reraise(exp, 'List->changeInfo: ')
예제 #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
예제 #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 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")
예제 #11
0
def increaseKey(iheap, key, newindex):
    """
    Incrementa el indice de un llave

    Args:
        iheap: El heap a revisar
        key: la llave a incrementar
        newindex: El nuevo indice de la llave
    Returns:
       El numero de elementos
    Raises:
        Exception
    """
    try:
        val = map.get(iheap['qpMap'], key)
        elem = lt.getElement(iheap['elements'], val['value'])
        elem['index'] = newindex
        lt.changeInfo(iheap['elements'], val['value'], elem)
        sink(iheap, val['value'])
        return iheap
    except Exception as exp:
        error.reraise(exp, 'indexheap:increaseKey')