如何有效存储262144变量?多维数组?

时间:2017-08-28 16:02:35

标签: arrays tree

我正在尝试编写一个程序,该程序读取包含数千个字符串的每个字符串(每个字符串长度为9个字母),仅由字母A,C,G和T组成(即DNA序列)

现在,在9个字母的字符串中当然有4 ^ 9种可能的A,C,G和T组合。我需要知道每个262144组合在我的.txt文件中出现的频率。

我的问题是,我(显然)不想初始化262144个别变量,在找到匹配项时逐渐增加,然后单独打印它们,因为那样会很疯狂。

所以,我的想法是创建某种树,根据每个节点遇到的字母沿着树枝向下,并存储每个分支“向下”的次数。 (即每个可能的9个字母的组合)在最后一个节点。

或262144个位置的数组,我可以存储每个可能组合的出现次数。然而,为此,我需要某种非冗余系统,根据在9-中哪个序列中遇到哪些字母,选择阵列中的唯一位置(以存储组合遇到的次数)。字母串。

例如:对于每个' A'遇到9个字母的字符串,我增加了我的指针变量' (它指向大数组中的位置)为0,因此每次遇到序列AAAAAAAAA时,我的数组的位置[0]增加1.对于每个' T'我将指针递增1,因此TTTTTTTTT会将数组的位置[9]递增1,依此类推。

然而,这给了我一个问题,即序列AAAAAAAAT和TAAAAAAAA(以及8 As和1T的所有其他组合)都将增加阵列的位置[1]。所以我必须使用某种系统,其中指针实际上可以实际到达0到262143之间的每个值?

我确定有更好的方法吗?多维数组或类似的东西?

祝你好运, rokyo

2 个答案:

答案 0 :(得分:2)

您希望将其存储为深度为9的树,每个节点可以有4个子节点,只是下一个字母的4种可能性中的每一种。每片叶子都有一个柜台。当你建造了你的树,经过所有的树叶,这将给你计数。

所以它会像这样工作: 按顺序阅读。 对于序列中的每个字符,选择正确的子项,如果不存在则创建节点。如果确实如此,那就去找孩子。 如果您位于字符串的末尾,则更新节点中的计数。 循环回读序列。

读取所有序列后,构建树。 通过树迭代,如果它是一片叶子(没有孩子),那么吐出计数。

这种方法的好处是,如果数据的大小发生变化,或者每个序列的长度仍然有效。这是树的典型用法。

答案 1 :(得分:1)

为什么是多维的。如果你想计算只是编码成一个整数并在262143整数数组中增加位置。

如何对字符串进行编码:将这4个字母视为具有2个位置的二进制数字。所以你需要18位代表一个组合。

A - 00
C - 01
G - 10
T - 11

AAAAAAAAA - 000000000000000000
ACACACACA - 000100010001000100  - 17476
GAAAAAAAA - 100000000000000000  - 131072
TAAAAAAAA - 110000000000000000  - 196608
AAAAAAAAT - 000000000000000011  - 3

内存中的数组取决于您要处理的最大出现次数。如果4亿就足够了,你需要大约1兆字节的内存来代表这个"计数器" -array。

每次计数访问都是O(1)。