创建给定变量集的所有可能排列

时间:2015-02-06 13:30:44

标签: c++ arrays algorithm set bioinformatics

我遇到与反向翻译有关的问题 问题本身可以表述为:给定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)AATAGT,4)AATTGT,5)ATAAGT,6)ATATGT

2 个答案:

答案 0 :(得分:2)

以下可能会有所帮助:

std::vector<std::string> translate(const std::vector<std::string>& v,
                                const std::map<std::string, std::vector<std::string>>& mapping)
{
    if (v.empty()) {
        return {};
    }
    std::vector<std::string> res = {""};

    for (const auto& s : v) {
        std::vector<std::string> tmp;

        for (const auto& seq : mapping.at(s)) {
            for (const auto& old: res) {
                tmp.push_back(old + seq);
            }
        }
        res = std::move(tmp);
    }
    return res;
}

使用:

  • v要翻译的序列
  • mapping "K"{"AAA", "GAA"}
  • 之间的映射

Live example

答案 1 :(得分:0)

你真的想得到所有排列(所有可能的密码子排序),或者所有可能的字母翻译成密码子(更像是同音异义替换)吗?

如果是后者,对于你的问题2,如果所有字母都有2个可能的密码子(远远超过O(n ^ 2)),则输出字符串的数量将为O(2 ^ n)。

你仍然可以通过递归函数相对简单地使用它(或者不像@Jarod42那样)。

对于你的问题1,我认为你的程序输入实际上是一种存储输出的紧凑方式...... 对于一个输入字符串,您的返回类型可以是std::vector<std::string>,因此您可以为所有输出字符串找到std::vector<std::vector<std::string> >吗?