c# - 如何获得一组可复制元素的所有唯一 n 长组合?

标签 c# algorithm combinatorics

我发现许多解决方案提供了一个以所有可能顺序组合的集合元素,但它们都只在每个结果中使用每个元素一次,而我需要将它们视为可重用。

例如,如果输入元素为 {"a", "b", "c"} 并且数字为 2,则输出为 {"a", "a"}, {"a", "b"},{“a”,“c”},{“b”,“a”},{“b”,“b”},{“b”,“c”},{“c”,“a” }, {"c", "b"}, {"a", "c"}。

最佳答案

假设您有 N 个输入元素,并且您想要一个 K 长组合。

您需要做的就是以 N 为基数进行计数,当然,范围包括所有具有 K 位数字的数字。

所以,假设 N = {n0, n1, ... nN}

您将从数字 [n0 n0 ... n0] 开始,一直数到 [nN nN ... nN]

如果您想了解如何在另一个基数中计数,您可以得到 here

您计算的每个数字都映射到您需要的 K 长组合之一。

我认为一个例子会有所帮助

我会使用你的值(value)观。 N = {a, b, c} 所以我们想以 3 为基数进行计数。 因为我们想要 2 长组合,所以我们只关心 2 位数字。 最小的 2 位基数 3 是 00,所以我们从那里开始。通过以 3 为基数计数,我们得到:

00
01
02
10
11
12
20
21
22

好的,现在将这些数字转换成一个组合。

记住,我们的集合是{a, b, c}

因此,每当我们看到 0 时,就表示 1。无论我们在哪里看到 1,它都表示 2,我相信您可以猜到 2 表示什么:)

00              aa
01              ab
02              ac
10   0 => a     ba
11   1 => b     bb
12   2 => c     bc
20              ca
21              cb
22              cc

关于c# - 如何获得一组可复制元素的所有唯一 n 长组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17257692/

相关文章:

c# - Entity Framework - CF/FA - 在 POCO 中定义过滤的导航属性

java - Java中的插入排序

c# - 在 C# 中的多值字典中搜索键

c# - OracleDataReader 只返回分页查询的最后一行

c# - 当角色可以组合到其他角色时,如何从列表中获取所有角色组合

algorithm - 在 C++ 中使用 opencv 跟踪 AVI 视频中对象的最佳算法

MATLAB:二进制矩阵的所有可能组合

algorithm - 受限安排的数量

Java 查找数组中的所有组合,这些组合加起来等于特定数字

c# - 我如何添加自定义属性,如 x :Name ="value"?