Exemplo n.º 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
Exemplo n.º 2
0
def linkage(df):
    T = RedBlackTree()
    link = []
    INF = 1e9
    centroids = {}
    number = {}
    n = df.shape[0]
    for i in range(n):
        centroids[i] = list(df.loc[i, :])
        number[i] = 1
    current_clusters = set([i for i in range(n)])
    for i in current_clusters:
        for j in current_clusters:
            if (i != j):
                T.add(triple(i, j, cityblock(centroids[i], centroids[j])))
    for z in range(n - 1):
        iter = T.__iter__()
        x = iter.__next__()
        while (not (x.left_c in current_clusters
                    and x.right_c in current_clusters)):
            T.remove(x)
            iter = T.__iter__()
            x = iter.__next__()

        centroids[n + z] = [0 for i in range(df.shape[1])]
        for i in range(df.shape[1]):
            centroids[n +
                      z][i] = (centroids[x.left_c][i] * number[x.left_c] +
                               centroids[x.right_c][i] * number[x.right_c]) / (
                                   number[x.left_c] + number[x.right_c])
        number[n + z] = number[x.left_c] + number[x.right_c]
        link.append([x.left_c, x.right_c, x.d, number[n + z]])
        current_clusters.add(n + z)
        current_clusters.remove(x.left_c)
        current_clusters.remove(x.right_c)
        for i in current_clusters:
            if (i != n + z):
                T.add(
                    triple(i, n + z, cityblock(centroids[i],
                                               centroids[n + z])))
    return np.array(link)