从几个给定的集合中生成所有可能的dna序列

时间:2009-11-24 15:58:01

标签: ruby set cartesian-product dna-sequence

我一直试图绕过这个问题一段时间但是却未能找到一个好的解决方案。这是:

给出了许多集合:

set1: A, T
set2: C
set3: A, C, G
set4: T
set5: G

我想从集合列表中生成所有可能的序列。在这个例子中,序列的长度是5,但它可以是任何长度,最多约20个。对于位置1,可能的候选者分别是'A'和'T',对于位置2,唯一的选项是'C',所以上。

上面例子的答案是:

ACATG,ACCTG,ACGTG,TCATG,TCCTG,TCGTG

我在ruby中这样做,我在主数组中有不同的数组作为数组:

[[A, T], [C], [A, C, G], [T], [G]]

起初我认为递归解决方案是最好的,但我无法弄清楚如何正确设置它。

我的第二个想法是创建另一个相同大小的数组,每个数组都有一个索引。因此00000将对应于'ACATG'之上的第一序列,而10200将对应于'TCGTG'。从00000开始,我会将最后一个索引增加一个,并用所讨论的集合的长度对其进行模数(对于set1为2,对于set2为1),如果计数器缠绕我将其归零并逐渐增加前一个。

但是我对这个解决方案的思考越多,对于这个非常小的问题来说似乎太复杂了。必须有一个我缺少的更直接的解决方案。谁能帮助我?

/尼克

1 个答案:

答案 0 :(得分:4)

Ruby 1.8.7中的Array类有一个Array#product方法,它返回有问题的数组的笛卡尔积。

irb(main):001:0> ['A', 'T'].product(['C'], ['A', 'C', 'G'], ['T'], ['G'])
=> [["A", "C", "A", "T", "G"], ["A", "C", "C", "T", "G"], ["A", "C", "G", "T", "G"],     ["T", "C", "A", "T", "G"], ["T", "C", "C", "T", "G"], ["T", "C", "G", "T", "G"]]