【发布时间】:2016-01-24 13:47:26
【问题描述】:
我正在构建来自 here 的代码。我想生成一组的所有排列,例如(取自线程):
Collection: 1, 2, 3
Permutations: {1, 2, 3}
{1, 3, 2}
{2, 1, 3}
{2, 3, 1}
{3, 1, 2}
{3, 2, 1}
每个集合都有 可能的排列,但这不是我想要实现的。请考虑以下集合:
这将产生 排列,极端数量。这将需要非常长的时间来计算,因为每个零都被认为是唯一的。
除此之外,我只想生成不同的排列。如果我们这样做,只有
排列remaining,因为 18 个项目是相同的 (k)。
现在,我可以从上述线程运行代码并将结果存储在 HashSet 中,从而消除重复排列。然而,这将是极其低效的。我正在寻找一种算法来直接生成有区别的排列。
【问题讨论】:
-
我很困惑。链接线程中的代码正在执行字典增量,这实际上适用于具有重复元素的多重集,不需要 HashSet。
-
好吧,我想说的是,您需要做的就是在应用算法之前使用输入的不同子集。
-
@DavidEisenstat 它工作正常,但计算需要很长时间。如果我不使用 HashSet,我会得到 2.4 * 10^18 个结果。
-
不,我的意思是生成的排列是成对不同的。
标签: c# algorithm performance recursion permutation