gpt4 book ai didi

java - 将一个组合并为多个组而无需重复

转载 作者:行者123 更新时间:2023-12-02 12:47:14 25 4
gpt4 key购买 nike

我们有一个元素列表 [A,B,C,D,E] 3组来组合这些元素,我想打印所有唯一组合的列表,而无需重复这3组。只有长度为[2,2,1]的组才有效(可以将其过滤掉,这不是必须的,但这是明智的选择,如果需要,可以手动将组的长度指定为参数)。我的意思是无重复的独特之处:

[[A,B],[C,D],[E]]和[[C,D],[A,B],[E]]和[[B,A],[C,D],[ E]]相同,所以组中元素的顺序或组的顺序无关紧要,我对那些组合不感兴趣。

在我的特殊情况下,我有16个项目和3组,每组分别为5、5和6个项目。

我要实现的示例:

/**
* Returns all the unique combinations of a group into multiple groups
* [data] the group of elements to combine
* [numberOfGroups] the number of groups
*/
fun combinations(data: List<String>, numberOfGroups: Int): List<List<List<String>>> {
// The combinations code
}

val data = listOf("A", "B", "C", "D", "E")
print(combinations(data, 3))

输出将是这样的:
[
[[A,B],[C,D],[E]],
[[A,D],[B,C],[E]],
...
]

先感谢您。

最佳答案

我一般不知道您的问题的答案,但是我将尝试解决将5个元素的列表分成几组[2,2,1]的特殊情况,并分享一些可以帮助您设计的原则一个更通用的解决方案。

首先,让我们谈谈如何表示结果。如果组内元素的顺序不重要,则使用Set<String>表示组很方便,因此setOf("A", "B")等于setOf("B", "A")。然后,如果组合本身的组顺序无关紧要,则该组合可以是一组组,即Set<Set<String>>

现在介绍算法本身。将这种算法构造为递归搜索很方便:您从数据中选择第一组项目,然后在没有选定项目的情况下解决数据问题,并将第一组与除它之外的所有解决方案合并。因此,我们搜索组合的函数可以如下所示:

fun combinationSequence(data: List<String>): Sequence<Set<Set<String>>> = sequence {
for (group in possibleFirstGroups(data)) {
val remaining = data - group
if (remaining.isEmpty()) {
yield(setOf(group))
} else {
yieldAll(combinationSequence(remaining).map { r -> setOf(group) + r })
}
}
}

然后如何以所有可能的方式选择第一组。对于大小为1或2的组,我们可以从所有数据元素中选择组的第一个元素,然后从其余的元素中选择第二个元素:
fun possibleFirstGroups(data: List<String>): Sequence<Set<String>> =
when (data.size) {
0 -> emptySequence()
1, 2 -> sequenceOf(data.toSet())
else -> sequence {
for (e1 in data) {
for (e2 in data - e1) {
yield(setOf(e1, e2))
}
}
}
}

我们的 combinationSequence返回结果,但是会有很多重复项,例如 [[A, B], [C, D], [E]][[C, D], [A, B], [E]]。要只保留它们的不同之处,我们可以使用 distinct函数:
combinationSequence(data).distinct().forEach { println(it) }

请注意,此解决方案的复杂度会随着项目数量的增加而呈指数增长,因此我不希望16个元素的解决方案能够及时终止:)

降低复杂度的一种方法是修剪搜索空间。例如,如果我们已经找到所有以 [A, B]组开头的组合,则可以避免产生包含该组位于中间某处的组合,例如 [C, D], [A, B], ...

关于java - 将一个组合并为多个组而无需重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55759517/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com