嘿伙计们我有个问题:
假设我们正在研究DNA链,每个链由10个核苷酸序列组成。每个核苷酸可以是四种不同类型的任意一种: A、G、T或C。编码一条DNA链需要多少个比特?
这是我的方法,我想知道这是否正确。
我们有10个名额。每个点可以有4个不同的符号。这意味着我们需要4^10组合使用我们的二进制数字。
4^10 = 1048576。
然后我们将找到其中的日志基2。你们觉得我的方法怎么样?
发布于 2016-03-02 05:47:06
每个核苷酸(又称碱基对)有两位(四种状态之一,-> 2位信息)。因此,10个碱基对需要20位。这样的推理比做log2(4^10)更容易,但是给出了同样的答案。
如果有任何组合不能出现的话,信息就会少一些。例如,一些密码子(三个碱基对的序列)永远不会出现。但是10条独立的2位信息等于20位。
如果某些序列出现得比其他序列更频繁,并且可变长度表示是可行的,那么Huffman编码或其他压缩方案可以节省大部分时间的比特。这在文件格式中可能是好的,但是当您使用它们时,它不太可能是内存中的好东西。
将数据密集地打包到一个由2位字段组成的数组中,会使访问单个基对的速度变慢,但是将整个块与另一个块进行相等比较仍然是有效的。(memcmp)。
不幸的是,对于16位整数(计算机擅长的)来说,20位太大了。存储在32位零扩展值数组中会浪费大量空间。在具有良好的非对齐支持的硬件上,存储24位零扩展值是可以的(做一个32位的负载和掩蔽高的8位。但是存储更不方便:可能是16b存储和8b存储,或者加载旧值并合并高8,然后执行32b存储。但那不是原子的。)
这是一个类似的问题,用于存储密码子(由三个碱基对组成的组,编码一个氨基酸):6位信息不能填充一个字节。不过,每8位中只有2位没有那么糟糕。
氨基酸序列(你不关心不同密码子之间仍然编码相同AA的突变)每个位置大约有20个符号,这意味着一个符号不太适合一个4位的啃食。
我以前在Dalhousie的系统遗传学研究小组工作,所以我有时会考虑看一下DNA序列软件,看看是否可以改进它们内部存储序列数据的方式。不过,我一直没来得及。真正的CPU密集型工作发生在找到最大似然进化树之后,您已经计算了每一对输入序列之间进化距离的矩阵。所以实际的序列比较并不是瓶颈。
发布于 2016-03-02 07:04:58
做数学:4^10 = 2^2^10 = 2^20
答: 20位
https://stackoverflow.com/questions/35738126
复制相似问题