【问题标题】:Shrink string encoding algorithm收缩字符串编码算法
【发布时间】:2014-01-12 22:38:26
【问题描述】:

我们如何将 20 个字母的字符串压缩/编码为 6 个字母。我发现很少有算法解决数据压缩问题,如 RLE、算术编码、通用代码,但它们都不能保证 6 个字母。

原始字符串可以包含字符 A-Z(大写)、0-9 和破折号。

【问题讨论】:

  • 如果你想要无损编码,那是不可能的。长度为 20 的 ASCII 字符串有 20^128 个可能,长度为 6 的字符串只有 6^128 个。你无法将第一个类别塞进第二个类别。
  • 20个字母的字符串类型有什么限制吗?
  • 无法保证这一点。您只能压缩具有某种可编码重复的字符串。
  • 糟糕,是吗?好吧,即便如此,第一个数字大于第二个,所以我的原点仍然有效。推荐阅读:pigeonhole principle,特别是上面写着“任何无损压缩算法,只要它使某些输入更小(正如压缩名称所暗示的那样),也会使其他一些输入更大。”
  • @shoover 我很确定 OP 想要一些可逆的东西(术语“编码”的通常含义),这与这种散列函数截然不同......

标签: string algorithm encoding shrink


【解决方案1】:

如果您的目标是无损将 20 个字符(每个字符可以是 [AZ]、[0-9] 或 -)的随机输入字符串压缩或散列为 6 个字符的输出字符串. 理论上是不可能的。

information theory 中,给定一个离散随机变量X={x|x1,...,xn}Shannon entropy H(X) 定义为:

其中p(xi)X = xi 的概率。在您的情况下,X 有 37 个可能的字符中的 20 个,因此它可能是{x|x1,...,xn},其中n = 37^20。假设这 37 个字符的存在概率相同(也就是输入字符串是随机的),那么 p(xi) = 1/37^20。所以输入的香农熵为:

。普通计算机中的char可以容纳8位,因此6个字符可以容纳48位。 无法将 104 位信息保存为 6 个字符。您需要至少 15 个字符来保存它。


如果您确实允许丢失并且必须将 20 个字符散列为 6 个字符,那么您正在尝试将 37^20 值散列到 128^6 键。它可以完成,但你会得到很多hash collisions

在您的情况下,假设您以最均匀的方式对它们进行散列(否则会更糟),对于每个输入值,平均会有 5.26 个其他输入值与其共享相同的散列键。通过birthday attack,我们可以预期在大约 2 亿次试验中发现碰撞。一台普通的笔记本电脑可以在不到 10 秒的时间内完成。 所以我认为这不是一个安全的散列。

但是,如果您坚持这样做,您可能需要阅读 Hash function algorithms。它列出了许多算法供您选择。祝你好运!

【讨论】:

  • OP 是否规定了无损要求?
  • @shoover 我正在编辑以考虑丢失的情况:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多