如何从 Erlang 中具有约束的集合的三个子集中找到所有可能的对?

发布于 2024-12-12 17:54:41 字数 978 浏览 4 评论 0原文

我有一个集合 M,它由三个子集 A、B 和 C 组成。

问题: 我想计算 M 的所有可能的子集 S(1)...S(N),其中包含所有可能的子集A、B 和 C 的元素之间的对的方式如下:

  1. 对于一对中的两个位置中的每一个,A 和 B 的元素只能在一对中出现一次(即 {a1,a2}{b1,a1} 可以是在一个子集 S 中,但该子集 S 中不允许有更多元素 {a1,_} 和 {_,a1});
  2. C 的元素可以在子集 S 中出现 1-N 次(即 {a,c}, {b,c}, {x,c} 可以在一个子集 S 中出现),但是 I想要获得子集 S 中 C 的所有可能元素数量的子集 S。

例如,如果我们有 A = [a1,a2], B = [b1,b2], C = [c1,c2 ],然后是一些结果子集 S 将会是(记住,它们应该包含成对的元素):

- {a1,b1}, {b1,a2}, {a2,b2}, {b2,c1};
- {a1,b1}, {b1,a2}, {a2,b2}, {b2,c1}, {c1,c2};
- {a1,c1}, {c1,a2}, {c1,b2}, {b1,c1};
- etc.

我倾向于认为,首先我需要找到 M 的所有可能的子集,其中仅包含 A 的一个元素、B 的一个元素和 1..N 个元素C<代码>(1)。之后我应该以某种方式从中生成成对的 (2) 集。但我不确定这是否是正确的策略。

因此,更详细的问题是:

  • 如果集合 M 的元素是整数,那么在 Erlang 中创建集合并查找子集的最佳方法是什么?
  • Erlang 中有没有现成的工具可以查找集合的子集?
  • Erlang 中是否有任何现成的工具可以生成集合中所有可能的元素对?
  • 在Erlang中如何解决上述问题?

I have a set M which consists of three subsets A,B and C.

Problem: I would like to calculate all possible subsets S(1)...S(N) of M which contain all possible pairs between elements of A, B and C in such manner that:

  1. elements of A and B can happen in a pair only once for each of two positions in a pair (that is {a1,a2} and {b1,a1} can be in one subset S, but no more elements {a1,_} and {_,a1} are allowed in this subset S);
  2. elements of C can happen 1-N times in a subset S (that is {a,c}, {b,c}, {x,c} can happen in one subset S), but I would like to get subsets S for all possible numbers of elements of C in a subset S.

For example, if we have A = [a1,a2], B = [b1,b2], C = [c1,c2], then some of the resulting subsets S would be (remember, they should contain pairs of elements):

- {a1,b1}, {b1,a2}, {a2,b2}, {b2,c1};
- {a1,b1}, {b1,a2}, {a2,b2}, {b2,c1}, {c1,c2};
- {a1,c1}, {c1,a2}, {c1,b2}, {b1,c1};
- etc.

I tend to think that first I need to find all possible subsets of M, which contain only one element of A, one element of B and 1..N elements of C (1). And after that I should somehow generate sets of pairs (2) from that. But I am not sure that this is the right strategy.

So, the more elaborated question would be:

  • what is the best way to create sets and find subsets in Erlang if the elements of the set M a integers?
  • are there any ready-made tools to find subsets of a set in Erlang?
  • are there any ready-made tools to generate all possible pairs of elements of a set in Erlang?
  • How can I solve the aforementioned problem in Erlang?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

好久不见√ 2024-12-19 17:54:41

有一个 sets 模块*,但我怀疑你最好先想出一个算法——它在 Erlang 中的实现是接下来出现的问题(或不是问题)。 (也许你注意到它实际上是一个图算法(比如,二分匹配某物),并且Erlang 的 digraph 模块会让你感到高兴。 )

长话短说,当你想出一个算法时,Erlang 很可能可以用来实现它。是的,对集合有一定的支持。但是,需要“所有可能的子集”的问题的解决方案往往是指数级的(即,给定 n 个元素,有 2^n 子集;对于每个元素,您要么拥有它无论是否在您的子集中),因此很糟糕。

(*有一些关于集合的模块)

There is a sets module*, but I suspect you're better off thinking up an algorithm first -- its implementation in Erlang is the problem (or not) that comes after this. (Maybe you notice its actually a graph algorithm (like, bipartite matching something something), and you'll get happy with Erlang's digraph module.)

Long story short, when you come up with an algorithm, Erlang can very probably be used to implement it. Yes, there is a certain support for sets. But solutions to a problem requiring "all possible subsets" tend to be exponential (i.e., given n elements, there are 2^n subsets; for every element you either have it in your subset or not) and thus bad.

(* there are some modules concerning sets)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文