【发布时间】:2015-02-06 13:30:43
【问题描述】:
我遇到了与反向翻译有关的问题。
问题本身可以表述为:给定 20 个唯一字母(对应 20 个氨基酸)的字符集,每个字母由 3 个字符组成的代码生成[A、T、G、C 中的任意 3 个]。生成编码给定氨基酸序列/字符串的所有可能的核苷酸序列。
20 种氨基酸有 64 种可能的核苷酸 [ATGC] 组合。
例如:赖氨酸,用字母K表示,由两个三联体(=密码子)AAA和GAA编码。
正向翻译很好,因为我可以将三联体映射到氨基酸密码,但问题在于反向翻译,其中三联体的各种组合是可能的,因为大多数氨基酸可以由多个密码子编码。
这是我的程序的基本框架:
//Map all Amino Acids with their corresponding codons.
std::map<std::string, string, std::less<std::string> > somevar;
somevar["K"]="AAA|GAA";......so on.
//Take input in string of Amino Acid single letter codes.
//Split each Amino acid into corresponding codons using stringstream
while(std::getline(ss, token, '|')){}
//Store the values in vector.
第一个问题:由于我不知道输入字符串的大小,我需要动态向量数组或向量向量。 (简单地说,如果发生类似 KK 的情况,将有两个数组类型变量存储 KK 的所有三元组。)有没有办法消除这种冗余(直接查看某个表)?
//Pass the arrays to a function which will return all possible permutations.
第二个问题:在解决了第一个问题后,我想用给定的氨基酸串创建所有可能的核苷酸序列组合。(即,从每个新创建的数组(集合)派生的所有可能组合)。
KK 会导致:AAAGAA,AAAAAA,GAAAAA,GAAGAA。
唯一的限制是复杂度应该是〜O(n ^ 2),我想知道我是否可以递归地做到这一点,或者C ++中是否有一些内置函数/库可以帮助我生成所有给定(变量)数据集的可能排列。
编辑:另一个例子 假设随机字母 A 有 3 个密码子,字母 Y 有 5 个密码子,那么组合的总数将为 3*5。
如果 M=AAT,ATA 且 N=GTT,AGT,TGT,则结果将为 1)AATGTT,2)ATAGTT,3)ATAGT,4)AATTGT,5)ATAAGT,6)ATATGT
【问题讨论】:
-
std::next_permutation 可能有用。
-
在申请
std::next_permutation之前记得std::sort,这样你就不会错过之前的排列。 -
@NickyC,我正在研究 std::next_permutation,我不确定是否可以在多维数组的上下文中实现它。
-
@Siddharth 只是展平数组表示?
-
@larnvst,无论如何我都需要扩展数组,因为在 n 之前存在多种组合。
标签: c++ arrays algorithm set bioinformatics