如果给出了两个数字列表,那么检测等效类的快速(est)方法是什么。
对于列表list1 = [1,1,2,3,3,4]
和list2 = [5,6,7,7,8,6]
应该是两个等价的类:eqClasses = [[1,4,5,6],[2,3,7,8]]
。
答案 0 :(得分:1)
您可以使用union-find or disjoint set algorithm。 (我总是在附近有一个实现,因为它非常有用。)只是" union"不同的压缩数字对然后得到"组"那些具有相同"领导者"。
的数字与问题无关的实施:
class UnionFind:
def __init__(self):
self.leaders = collections.defaultdict(lambda: None)
def find(self, x):
l = self.leaders[x]
if l is not None:
l = self.find(l)
self.leaders[x] = l
return l
return x
def union(self, x, y):
lx, ly = self.find(x), self.find(y)
if lx != ly:
self.leaders[lx] = ly
def get_groups(self):
groups = collections.defaultdict(set)
for x in self.leaders:
groups[self.find(x)].add(x)
return list(groups.values())
应用:
list1 = [1,1,2,3,3,4]
list2 = [5,6,7,7,8,6]
uf = UnionFind()
for a, b in zip(list1, list2):
uf.union(a, b)
print(uf.get_groups())
# [{8, 2, 3, 7}, {1, 4, 5, 6}]
答案 1 :(得分:0)