【问题标题】:simple & compact code for compressing DNA-like strings用于压缩类似 DNA 的字符串的简单紧凑的代码
【发布时间】:2013-12-11 18:34:41
【问题描述】:

我的应用程序是多项选择测试,其中每个问题的响应都会产生一个 4 个字母的字符串“例如”GTAC 或 ATGC 或 CATG 等。总是只有 24 个问题。所以最终的结果是这样的

GTAC CATG TACG GACT GTAC CATG TACG GACT GTAC CATG TACG GACT GTAC CATG TACG GACT GTAC CATG TACG GACT GTAC CATG TACG GACT

所以每个响应有 4!=24 种可能性。我可以将每种可能性映射到一个字母 A-X,这会将其缩减为 24 个字母大小的字符串,但我相信必须有一种简单的方法将其缩减到大约 6 个字符。

结果将通过 http 请求发送,因此我需要将其压缩为字母数字字符串,例如 base64 但不一定是 base64。

数据只是一个像上面这样的字符串,或者我可以把它放在任何格式来匹配你的循环。我正在寻找类似 10 行压缩算法的东西。我将在 javascript 中压缩并在 php 中解压缩。

【问题讨论】:

  • Base64 会膨胀您的数据。当您的数据在 [A,T,G,C,] 域中时,没有原因
  • @mccainz 是的,我明白这一点。我的意思是我们可以将它压缩成一个字母数字字符串,base64 是 64 个合法字符的一个很好的起点
  • @AbraCadaver,我同意.. 我认为他将 4 个代码序列映射到 A-X 就足够了。
  • @AbraCadaver 这不仅仅是为了 http 之旅而压缩它。数千人的结果将存储在数据库中。
  • @mcainz,我认为他们现在拥有的 96 字节就足够了,但 24 会有所改进。

标签: javascript php algorithm compression


【解决方案1】:

你可以得到的最小值是 24 lg(24) ~= 111 位或 14 字节。然后要将其编码为 84 个 URL 可接受的字符,您必须将其扩展为至少 18 个字符。 24 lg(24) / lg(84) = 17.2。假设 24 个答案中的每一个都可能有所有 24 个选项,那么就没有办法让它少于 18 个字符。当然不是六个。

你用 24 个字符编码的方案对我来说似乎很好。 18 比 24 的增益似乎不值得任何额外的复杂性。但是,如果您必须...

将答案分成八组,每组三人。对于每三组,将其视为一个以 24 为基数的三位数字,其范围为 0..13823。这将适合 14 位。其中八个是 14 字节或 112 位。

现在一次提取 19 位。将有六组,最后一组只有 17 位。对于每组 19 个,将其编码为 3 位以 81 为基数的数字,发出三个 URL 安全字符。 813 > 219。从 84 个 URL 安全字符中挑选您最喜欢的 81 个字符。

现在您有 18 个字符代表 24 个答案。除非您没有告诉我们的答案还有其他限制条件,否则您不能做得比这更好。

【讨论】:

  • 3 位和 14 位组正是我想出的。我在代码高尔夫上发布了类似的内容,结果是 18 个字符,尽管它只使用了 64 个字符。我可能会坚持使用 24 个字母,无论如何这对于机器学习集群来说会更好。
  • 只有 64 个字符是不可能的。
  • 看看这个。这是代码高尔夫,这家伙用 64 输出 18 个字符:codegolf.stackexchange.com/questions/15831/…
  • 我不需要看代码。一组 64 个字符中的 18 个字符无法编码所有可能的输入,因为可能的输入比这更多。 64^18 小于 24^24 的四分之一。这些计算并不难。
  • 但是你不能说任何无损压缩算法吗?比如bmp vs png。我知道 png 使用了一个完全不同的想法,但也许有一些非游程算法可以做类似的事情。这家伙称之为双射计数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多