【问题标题】:Algorithm to Map Strings to Short Replacements将字符串映射到短替换的算法
【发布时间】:2011-02-23 17:47:02
【问题描述】:

我正在寻找用唯一且最佳的短替换来确定性地替换唯一字符串的方法。所以我有一组有限的字符串,到目前为止我可以实现的最佳压缩是通过枚举算法,我对输入集进行排序,然后用扩展字母表上的字符字符串枚举替换字符串(a..z , A...Z, aa...zz, aA...zZ, a0...z9, Aa..., aaa...zaa, aaA...zaaA, ....)。

就压缩而言,这非常有效,但有一个严重的缺点,即它在任何给定的输入字符串上都不是原子的。相反,它的结果取决于从一开始就知道所有输入字符串,以及输入集的排序

任何人都知道具有类似压缩但不需要预先知道所有输入字符串的算法?!例如,散列对我不起作用,因为根据输入集的大小,我需要一个 8-12 的散列长度才能使散列唯一,这对于替换来说太长了(目前,替换字符串对于我的用例(

【问题讨论】:

  • 可能输入的字符是从什么字母表中绘制的?例如只是小写字母;大写和小写字母;字母数字;等等。另外,我认为你的意思是'确定性',你有'原子'。
  • 除非您提供有关类型输入字符串的更多详细信息,否则很难回答。不可能有一个通用算法可以在没有冲突的情况下对单个字符串起作用。将一个巨大的文件视为单个字符串。现在您尝试仅使用 3 个字节来表示...
  • @AakashM 输入字符串基本上是 (?u)[a-zA-z_$][\.\w$]*,所以 unicode 字母数字带有一些额外的字符。使用“原子”,我的意思是我不能自己计算给定输入字符串的替换并逃脱它,因为,是的,它不是确定性的。
  • @Moron 想想类似 C 的程序文本中的标识符。
  • 这是用于 javascript minifier 还是类似的东西?

标签: algorithm string optimization


【解决方案1】:

您可以使用您的枚举方案,但按您第一次遇到输入字符串的顺序排序。

例如,您处理的第一个字符串可以映射到“a”。 下一个不同的字符串将映射到“b”等。

每次处理字符串时,都需要查看它是否已被映射。

【讨论】:

  • 哦,是的,查找在订购问题上放宽了。谢谢!
【解决方案2】:

“最佳短”取决于从中抽取样本的字符串数量。在总体中没有系统冗余的情况下,您会发现只有一小部分任意字符串可以被压缩(例如,考虑尝试压缩随机位字符串)。

如果您可以对您的数据做出假设,例如“字符串预计主要由英语单词组成”,那么您可以根据字母频率做一些简单有效的事情(例如,对于英语,相对频率顺序是类似 ETAOINSHRDLUGCY...,因此您可能希望使用更少的位来表示 Es,而使用更多的位来表示不常见的字母(如 Q)。

干杯。

【讨论】:

  • 谢谢,但这不是关于必须在某个时候解码的编码(也许我应该避免使用“压缩”一词)。它实际上是关于从字符串到(几乎)任意短字符串的双射映射。我猜典型的字符串压缩算法会给我留下比 1-3 个字符长得多的替换。
  • @ThomasH -- 呃,从任意长字符串到短字符串的双射压缩!
  • 同意:)。只是人们通常认为它是一个必须在某个时候反转的过程(也称为“解压缩”),这不是我所需要的。
猜你喜欢
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
  • 2012-01-23
  • 2012-04-26
  • 2012-08-21
  • 1970-01-01
  • 2014-05-26
  • 2017-01-16
相关资源
最近更新 更多