【问题标题】:Get unique groups from a list从列表中获取唯一组
【发布时间】:2020-04-20 18:04:20
【问题描述】:

我正在尝试创建一个算法,以从具有 len(L) 值的列表 L 中创建长度 = N 的唯一组。

编辑:唯一组是一个组,其中任何值以前从未与组中的任何值一起使用。

编辑:因此,如果不是价值观,我们将拥有人,那么小组中的任何人都应该始终只结识新小组中的新人。

假设我们有一个列表 L 并尝试找到 4 个唯一组:

L = [1,2,3,4,5,6,7,8]
N = 4

unique_groups = [[1,2,3,4], [5,6,7,8]]
len(unique_groups) = 2

所以这里我们有 8 个值和 2 个唯一组,任何新组都将包含至少一个包含在前一个组中的值,例如[1,2,3,5] 或 [1,3,5,7] 至少包含两个之前的值,因此这些组不是唯一的。

其中 len(L) = 12,我们有 3 个不同的组,而 len(L) >= 16 为我们提供了更多选择:

L = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
N = 4

unique_groups = [[1,2,3,4], [5,6,7,8], [9,10,11,12], [13,14,15,16], [1,5,9,13], [2,3,7,12] ...]
len(unique_groups) = ?

我尝试了一些不直观且缓慢的方法,即比较所有组合,如果列表长度变大,这将花费大量时间。 这是其中一种方法:

def findsubsets(s, n):
    return list(itertools.combinations(s, n))


s = [1,2,3,4,5,6,7,8]


sets = findsubsets(s,4)

sets_unique = []


def compare_sets(set1, set2):
    init_eq = 0
    for s1 in set1:
        if s1 in set2 and init_eq > 0:
            return False
        elif s1 in set2 and init_eq < 1:
            init_eq += 1
        else:
            continue
    return True


for s in sets:
    start_point = sets.index(s)
    print(start_point)
    for i in range(start_point + 1, len(sets) + 1):
        set2 = sets[i]
        if compare_sets(s, set2):
            print(s, set2)
            sets_unique.append(set2)

print(sets_unique)

EDIT2:这个现实生活中的问题是匹配一组 N 中的员工,所以这些组永远不会包含两个相同的人。每个人都应该只结识新朋友。

【问题讨论】:

  • 为什么[5,6,7,8][1,5,9,13] 是独一无二的?它们不包含一些共同的元素吗?
  • 你在创建列表元素的组合吗?
  • 我没有很好地说明我所说的独特性。它必须是一个群体,其中价值观在一个群体中“从未见过”。所以@DaniMesejo,这两组是独一无二的,因为 5 只有 6,7,8,然后是 1,9,13

标签: python list algorithm set combinations


【解决方案1】:

你的问题更新现在很清楚了;谢谢。

这个问题与projective plane 中的点和线集同构。您正在尝试使用每条线上的 N 点构建尽可能多的线。在“有限示例”小节下查看过程的可视化,在“向量空间构造”小节下查看正式算法。

为了给您一个想法,您将从任意选择的点1 开始。通过(方便地)附加连续的、不相交的三元组来制作集合(共线点):

1  2  3  4
1  5  6  7
1  8  9 10
1 11 12 13
...

这将为您提供包含点 1 的所有组。现在是数学上有趣的部分:如何交叉链接点 2 和更高将定义 projective plane;这里的解决方案不是唯一的。一种标准算法搜索同胚解决方案,即贪心算法:在每个选择点,选择对当前空位合法的最低编号点。 这会给我们

2  5  8 11
2  6  9 12
2  7 10 13
...
3  5  9 13
3  6 10 11

等等

您需要定义是想要所有可能的不同解决方案,还是只想要您能找到的第一个解决方案。每个不同的解决方案都定义了不同的投影平面拓扑。

从射影平面的角度处理这个问题让您从 仿射 开始并从那里推导出平面。尤其是检查仿射平面

的三个属性

其他参考: http://www.mathpuzzle.com/MAA/47-Fano/mathgames_05_30_06.html

现在够你玩了吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    相关资源
    最近更新 更多