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
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)