微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

基于关系的矩阵分组

如何解决基于关系的矩阵分组

我遇到了根据矩阵关系来解决矩阵分组问题的问题。

问题

请考虑一群人互相提供书籍。更正式地说,小组由彼此认识的所有人组成,无论是直接认识还是传递。

示例

考虑输入矩阵 M

输入

1100
1110
0110
0001

输出

2

enter image description here

  • 有n = 4个人,编号为related [0]至related [3]。
  • 有两对彼此直接认识:( related [0], related [{1])和(related [{1],related [2])。因为关系是 可及的,这组人{related [0],related [1],related [2]}是 被认为是一个团体。
  • 剩下的相关人[3]不认识其他任何人,并且 是一个单独的组:{related [3]}
  • 共有2组。

示例

输入:

10000
01000
00100
00010
00001

输出

5

显示直接关系,因此有5组:{相关 [0],相关[1],相关[2],相关[3],相关[4]}

示例

输入

1100000
1110000
0110000
0001000
0000110
0000110
0000001

输出

4
  • 有两对彼此直接认识:( related [0], related [{1])和(related [{1],related [2])。因为关系是 可及的,这组人{related [0],related [1],related [2]}是 被认为是一个团体。
  • 有1对彼此直接认识的:(相关[4],相关[5])。因此,它们被视为单个组{related [4],related [5]}
  • 与[3],[6]相关的其余人不认识任何其他人,并且 是一个单独的组:{related [3]},{related [6]}
  • 共有4个组:{{相关[0],相关[1],相关[2]},{相关[4],相关[5]},{相关[3]}, {related [6]}}

我需要有关如何解决此类问题的帮助。

代码 (我尝试未完成)

def countGroup(matrix):
    people = set()
    group1 = set()
    for i in range(len(matrix)):
        people.add(i) 
        for j in range(len(matrix)):
            if i == j:
              # next
              continue
            if matrix[i][j]:
                group1.add((i,j))
                people.discard(i)
                people.discard(j)
                # group1.add(i)
                # group1.add(j)
    print(people,"people")
    print(group1,"group1")
    count = len(people)
    if group1:
        count += 1

    return count


解决方法

您几乎在那儿,问题是if不太正确,您需要更多使用集合。尚未测试代码,但应该进行一些细微调整,我的python有点生锈。

def countGroup(matrix):
    people = set()
    group1 = set()
    for i in range(len(matrix)):
        people.add(i) # Quick way to build a list of all the people
        for j in range(len(matrix)):
            if i == j: # Not useful,you should know yourself. 
              # Could avoid this by using itertools.combinations
              continue
            if matrix[i][j] == 1: # we just want to know
                group1.add(i)
                group1.add(j)
    group2 = people - group1 # Anyone not in group1 is in group2.

    return (group1,group2)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。