【发布时间】:2010-12-19 22:42:03
【问题描述】:
一段时间以来,我一直在尝试解决这个问题,但未能提出一个好的解决方案。如下:
给定多个集合:
set1: A, T
set2: C
set3: A, C, G
set4: T
set5: G
我想从集合列表中生成所有可能的序列。在这个例子中,序列的长度是 5,但它可以是大约 20 左右的任何长度。对于位置 1,可能的候选者分别是“A”和“T”,对于位置 2,唯一的选项是“C”,所以开。
上面例子的答案是:
ACATG、ACCTG、ACTGG、TCATG、TCCTG、TCTGG
我在 ruby 中执行此操作,并且我将不同的集合作为主数组中的数组:
[[A, T], [C], [A, C, G], [T], [G]]
起初我认为递归解决方案是最好的,但我无法弄清楚如何正确设置它。
我的第二个想法是创建另一个相同大小的数组,每个数组都有一个索引。因此 00000 将对应于“ACATG”上方的第一个序列,而 10200 将对应于“TCGTG”。从 00000 开始,我会将最后一个索引增加 1,并将其与相关集合的长度取模(set1 为 2,set2 为 1),如果计数器环绕,我会将其归零并将前一个索引增加一个。
但是我对这个解决方案的思考越多,对于这个非常小的问题来说似乎太复杂了。必须有一个我缺少的更直接的解决方案。谁能帮帮我?
/尼克
【问题讨论】:
-
我认为您的解决方案并不复杂。等价于计数(如在 i++ 中),但每个数字的基数不同。
-
顺便说一句,如果你想要一个更好的搜索词:permutations。
-
我认为您应该搜索“笛卡尔积”而不是“排列”...
-
@Erlock:是的,这样更好。
-
是的,我认为这一定是已知解决方案的已知问题。所以“笛卡尔积”是我正在寻找的术语。非常感谢。
标签: ruby set cartesian-product dna-sequence