A set union find algorithm

前端 未结 5 551
我寻月下人不归
我寻月下人不归 2020-12-03 02:00

I have thousands of lines of 1 to 100 numbers, every line define a group of numbers and a relationship among them. I need to get the sets of related numbers.

Little

5条回答
  •  夕颜
    夕颜 (楼主)
    2020-12-03 02:28

    You can model a group using a set. In the example below, I've put the set into a Group class to make it easier to keep references to them and to track some notional 'head' item.

    class Group:
        def __init__(self,head):
            self.members = set()
            self.head = head
            self.add(head)
        def add(self,member):
            self.members.add(member)
        def union(self,other):
            self.members = other.members.union(self.members)
    
    groups = {}
    
    for line in open("sets.dat"):
        line = line.split()
        if len(line) == 0:
            break
        # find the group of the first item on the row
        head = line[0]
        if head not in groups:
            group = Group(head)
            groups[head] = group
        else:
            group = groups[head]
        # for each other item on the row, merge the groups
        for node in line[1:]:
            if node not in groups:
                # its a new node, straight into the group
                group.add(node)
                groups[node] = group
            elif head not in groups[node].members:
                # merge two groups
                new_members = groups[node]
                group.union(new_members)
                for migrate in new_members.members:
                    groups[migrate] = group
    # list them
    for k,v in groups.iteritems():
        if k == v.head:
            print v.members
    

    Output is:

    set(['T6', 'T2', 'T1'])
    set(['T4', 'T5', 'T3'])
    

提交回复
热议问题