【问题标题】:Algorithm for generating a unique (constant) code for a string which should be reversible为应该是可逆的字符串生成唯一(恒定)代码的算法
【发布时间】:2014-03-13 07:38:47
【问题描述】:

要求:

我们在数据库中有类似的值

Chennai
Baroda
Bangalore
New Delhi
São Paulo, Lisboa
San Jose

等等……

所以我想将这些字符串转换为唯一的短字符串。例如

Chennai –> xy67kr

San Jose –> iuj73d

基本上类似于 URL 缩短器。

转换它的算法应该是可逆的。即当我将“xy67kr”传递给解码函数时,它应该返回“Chennai”。

期待帮助。

【问题讨论】:

  • 字符串需要固定长度吗?
  • 如果你有一个数据库,那么反转的处理应该很容易......
  • @taher:没有函数可以以可以反转的方式缩短任意字符串(由于pigeonhole principle)。除非您可以对输入字符串的值进行严格限制,否则您将不得不使用某种查找机制。
  • 我不明白..你有它数据库,但你不想使用数据库?
  • @taher: 但是这个算法不存在...

标签: algorithm url-shortener


【解决方案1】:

正如其他发帖者所说,你不能有一个缩短任意字符串的函数,这在数学上是不可能的。但是您可以创建一个自定义函数来很好地处理您的特定字符串集。

一个示例方法是计算集合中的字符频率,然后使用prefix code 对字符进行编码,以便使用短前缀(即Huffman coding)对最常见的字母进行编码。

上面的方法没有利用在自然语言中下一个字符可以从之前的字符中非常准确地预测的事实,所以你可以扩展上面的算法,而不是独立地编码字符,而是编码下一个字符在一个 n-gram 中。这当然需要比简单方法更大的压缩表,因为您实际上拥有取决于前缀的单独代码。例如,如果 'e' 在 'th' 之后非常频繁,则在 'th' 之后的 'e' 使用非常短的前缀进行编码。如果 'e' 在 'ee' 之后非常不常见,那么在这种情况下可以使用很长的前缀对其进行编码。解码算法显然需要查看当前解压后的前缀来检查如何解码下一个字符。

这种通用方法假设频率不变,或者至少变化缓慢。如果您的数据集发生变化,您可能需要重新计算统计数据并重新编码字符串。

【讨论】:

  • 我怀疑这是否适用于短输入数据。 OP 似乎也想要一个固定长度的编码,这显然是不可能的。
  • @OliCharlesworth 相反,这种统计编码即使对于单个字符串也很有效,除了即使结果代码是 6 位,那么您仍然必须发送 (或保存)至少一个字节。我同意固定长度编码是不可能的。
  • 好的,在我最初的问题中,我问我的输入字符串可以是可变长度的。因此,假设我通过应用填充使它们具有固定长度,即 --> New York [becomes] --> New York!@!!@!或类似的东西。那么编码后是否可以缩短它们?
  • @taher Oli 指的是字符串 after 编码的长度。鸽巢原则指出,保证最终字符串固定的唯一方法是限制输入字符串的集合(使其大小不大于固定长度字符串的数量)。唯一可行的方法是(对于任意集合)是使用数据库,就像 URL 缩短器一样。如果没有数据库,您可以做的最好的事情是使用针对您的数据调整的压缩算法。这可以实现非常好的压缩 - 虽然没有固定大小的输出。
  • 谢谢大家,我已经得到了答案。
【解决方案2】:

查看my answer 类似的问题,只需将其重写为 PHP:

编码:

$encoded = base64_encode(gzdeflate("São Paulo, Lisboa"))

解码:

$decoded = gzinflate(base64_decode($encoded))

请注意,gzdeflate 在短字符串上的性能优于 gzcompress

但无论如何,这个问题是对于短字符串它会使字符串更长。这在较长的文本上表现更好。 使用一些带有先验信息的压缩算法当然会更好,例如 ppm 或带有初始后缀树的后缀方法......然后它也可以完美地处理短字符串。

【讨论】:

  • 使用一些 先验信息的压缩算法当然会更好,例如 ppm 或带有初始后缀树的后缀方法...然后它可以完美地工作短弦也。但问题是这些方法是否可以在 PHP 中访问。
【解决方案3】:

您不能将任意长度的字符串缩短为固定长度的字符串。

您可以做的是为数据库中该特定字符串的行的唯一 ID 创建这些短字符串。以下是一些提示:How to design a sequential hash-like function

【讨论】:

    【解决方案4】:

    这不一定是确定性的,但显然您可以使用查找表。该服务类似于 goo.gl 或 imgur

    【讨论】:

      猜你喜欢
      • 2019-09-26
      • 2014-10-28
      • 2013-05-28
      • 1970-01-01
      • 2011-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多