Example #1
0
def func(li):
    li.sort(key=lambda x: x[1])
    tree = RedBlackTree()
    for a, h, b in li:
        prev_b = tree.floor(My_pair(b, None))
        if prev_b is None:
            height_b = 0
        else:
            height_b = prev_b.value

        next_a = tree.ceil(My_pair(a, None))
        while (next_a is not None) and next_a.key <= b:
            tree.remove(next_a)
            next_a = tree.ceil(My_pair(a, None))

        tree.add(My_pair(a, h))
        tree.add(My_pair(b, height_b))

    prev_height = 0
    ans = []
    for element in tree:
        if element.value != prev_height:
            prev_height = element.value
            ans.append((element.key, element.value))
    return ans
Example #2
0
def true_address_no_sort(lcp: list, au: RedBlackTree, s_arr: deque, top=100, bot=20, distance=300):

    # dict to be returned
    d = OrderedDict()

    assert type(au) == RedBlackTree

    if type(lcp) != deque:
        lcp = deque(lcp)

    if type(s_arr) != deque:
        s_arr = deque(s_arr)

    assert len(lcp) == len(s_arr)
    d = {}
    past = 0
    runs = len(lcp)
    for _ in trange(runs,desc="calculating unique starts: "):
        l = lcp.popleft()
        lcp.append(past if past > l else l)
        past = l
    runs = len(s_arr)
    pbar = tqdm(total=runs, desc="Finding true addresses: ")

    u_ceil = 0
    u_floor = 0
    myl = []
    while s_arr:
        sa = s_arr.popleft()
        pbar.update(1)
        # get next suffix address and corresponding lcp (unique start) value
        lcp_curr = lcp.popleft()

        if type(sa) != int and type(lcp) != int:
            sa = int(sa)
            lcp_curr = int(lcp_curr)

        if sa > u_ceil or sa < u_floor:

            # myl = list from RedBlackTree
            # [unam ambs]
            myl = au.floor([sa])
            u_floor = 0 if not myl else myl[0]

            myl = au.ceil([sa])
            if not myl:
                continue
            u_ceil = myl[0]

        if (lcp_curr + sa) > u_ceil:
            continue

        else:
            difference = u_ceil - sa # do we need to add 1 here?
# todo: is the u_floor going too low?
        d[sa + myl[1]] = (lcp_curr, (difference if difference < top else top))

    return d
Example #3
0
def func(li):
    tree = RedBlackTree()
    depths = []
    for num in li:
        next_node = tree.ceil(My_pair(num, None))
        prev_node = tree.floor(My_pair(num, None))
        parent_depth = -1
        for node in (next_node, prev_node):
            if node != None:
                parent_depth = max(parent_depth, node.value)
        tree.add(My_pair(num, parent_depth + 1))
        depths.append(parent_depth + 1)
    return depths