编码字符的最有效方法是什么? (关于内存)

我有4个要编码的字符: 有没有办法给他们一个“编码版本”,而不是ASCII?二进制将是最好的,但是对于二进制我只有0和1,并且如果我随后使用序列,则不清楚例如哪个字符为0,哪个1和哪个11。还有其他方法可以用最少的位数有效编码吗? 谢谢

wxfjf200806 回答:编码字符的最有效方法是什么? (关于内存)

有4个不同的值。 2位可以编码4个值。

00
01
10
11

这意味着每个字节可以编码4个不同的值。

+---+---+---+---+---+---+---+---+
| 4 | 4 | 3 | 3 | 2 | 2 | 1 | 1 |
+---+---+---+---+---+---+---+---+

例如,我们可以选择以下编码方案:

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

110(0b01101110)因此表示ACAG(假定在最低有效位中找到第一个值)。

+---+---+---+---+---+---+---+---+
| 0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 |
+---+---+---+---+---+---+---+---+
 ---G--- ---A--- ---C--- ---A---

这意味着在使用ASCII时,该字符串仅占用空间的25%。

除了这不太起作用。无法知道序列的长度。例如,如何使用上述方案对ACA进行编码?

有选项:

  1. 以某种方式将序列的长度作为前缀。

    如果编码的字符串真的很短,则最终可能会使编码的字符串的长度加倍。

  2. 引入第5个前哨值以指示字符串的结尾。

    这使编码变得复杂(因为我们不再具有2的幂)。它还降低了压缩系数(每3个字节8个值,因此使用ASCII时仅占用空间的37.5%)。

  3. 使用每个字节的前2位指示该字节中实际存在多少个值。这样可以减少压缩系数(每个字节3个值,因此使用ASCII时仅占用33%的空间)。

  4. 您可以使用实际的压缩技术(例如,使用频率分析将较短的序列用于更常见的子序列),可能使用zlib或更现代的等效技术。此方法非常有效(甚至可能使用ASCII的1/10),但是仅在序列很长的情况下才有效。它还可以防止随机访问。这意味着如果不先读取所有前一个值就无法获得Nth值。简而言之,您必须将字符串解码为ASCII才能搜索。

您在注释中表示要在序列中搜索子序列,但是这些方法都没有那么容易(如上所述,第四个方法可以防止这种情况)。实际上,它们使事情变得非常复杂。强烈建议将序列转换为ASCII以进行搜索。

本文链接:https://www.f2er.com/3140024.html

大家都在问