【发布时间】:2020-04-09 05:48:11
【问题描述】:
给定一个大小为 N 的数组,以元素和的递增顺序打印大小为 K (0<K<=N) 的所有子集
Array:
[6,8,3,9], N=4, K=3
Sorted Subsets:
[3, 6, 8] (sum=17)
[3, 6, 9] (sum=18)
[3, 8, 9] (sum=20)
[6, 8, 9] (sum=23)
我不需要整个排序列表,而是需要前 T 个条目(T 很小)。列出所有子集(nCk)并对它们进行排序对于大 N 来说将非常昂贵。有没有办法在不实际枚举所有子集的情况下获得前 T 个子集?我正在考虑选择最小的 K 元素,这是最小的子集,然后通过替换一个或多个元素找到下一个最小子集的方法,但是替换的选择又太多了。
【问题讨论】:
-
只是一个想法。如果
K为 3,并且您取输入数组中最小的 4 个元素,则通过选择这 4 个元素中的 3 个,您将得到四个最小的子集。取 5 个元素,您可以形成最小的 5C3 子集。 -
@user3386109 这不适用于例如
[3, 6, 7, 8, 9]- 您的算法会在3, 6, 9之前生成6, 7, 8。 -
我不确定我错过了哪一步。我要说的是,对于某些输入,可以有一个包含数组最后一个元素的子集,该子集小于不包括数组第一个元素的任何子集,因此任何基于迭代产生子集的算法- 数组的增长前缀不起作用。 “取输入数组中最小的 4 个元素,您将通过选择这 4 个中的 3 个来获得四个最小的子集” 的陈述是错误的。
-
“我想说的是,对于某些输入,可以有一个包含数组最后一个元素的子集” 我假设你的意思是一些输入,可以有一个包含数组的最大元素的子集。那是对的吗? @kaya3
-
@kaya3 好的,所以我最初的想法是,在一般情况下,不需要数组的最大元素。例如,如果
k=3和T=10和N=100,则不需要数组的第 100 个元素。需要考虑的是,“你需要多少数组元素?”