将一组与短字符串相似的字符串映射

时间:2013-11-17 17:06:04

标签: java algorithm data-structures compression

我有一组相同长度的字符串(10chars),具有以下属性。 该集的大小约为5000 - 10,000个字符串。数据集可以经常更改。 虽然每个字符串都是唯一的,但特定模式的子字符串会出现在大多数字符串中,而不一定在同一位置。

Some examples are
123abc7gh0
t123abcmla
wp12123abc

123abc 是大多数字符串中出现的子字符串

问题是将每个字符串映射到一个较短的字符串,这种映射应该是确定的。 我可以使用一个简单的枚举算法,它将遇到的每个字符串映射到递增的计数器值(在排序字符串集上)。但由于该集合必然会频繁更改,因此我无法使用此算法以确定的方式为各种运行计算映射。 我还可以使用像霍夫曼编码这样的数据压缩算法来压缩每个字符串。但我不相信这会有效,因为每个字符串本身的重复字符都少得多。 应该通过利用数据集的属性来适应解决问题的方法是什么?请注意,我不想压缩整个数据集,但希望将集合中的每个字符串映射到缩短的字符串。

3 个答案:

答案 0 :(得分:1)

如果您可以预处理字符串集并且可以知道每个字符串中出现的模式,则可以将其视为单个字符(使用某种编码),这会缩短该字符串。

答案 1 :(得分:1)

  1. 将'common string'替换为任何字符串中未出现的字符。
  2. 对所有字符串进行概率分析
  3. 根据分析创建一个Hufman树,即最常见的字符位于树的顶部,从而产生短代码。
  4. 根据#3树的hufman编码替换样本字符串,并将结果大小与原始字符进行比较。如果大多数字符均匀地在字符串之间传播,则Hufman编码不会减少但会增加大小。
  5. 如果Hufman没有获得任何改进,您可以尝试使用LZW或任何其他基于字典的压缩方法。然而,这仅在字符串的结构(即字符/子字符串的分布)不随时间完全改变时起作用。例如,如果字符串由英语单词组成,则子字符串字典压缩(LZW)可能是一个很好的候选者。

    但是如果分布发生变化或字符分布仅仅等于所有字符,我恐怕没有适合缩小字符串大小的压缩方法。

    但最后一个问题仍然存在:为什么?为什么要压缩10000个字符串呢?

    编辑:答案是:字符串用于创建文件夹名称(路径)。由于总长度有限制,因此应尽可能紧凑。

    您可能尝试创建数据库(即字典)并使用索引(例如编码为Base64)作为压缩字符串。假设最大字典大小为2 ^ 32-1时,这最多可以提供5个字符。

答案 2 :(得分:1)

我遇到了同样的任务,并想知道是否有可能在不使用持久性的情况下实现映射

如果允许使用中的映射,那么解决方案很简单: 您可以为每个字符串分配一个数字(使用足够高的基数表示,以便获得所需的最大数字大小和字符串表示)。对于每个源字符串,您将分配下一个数字并使用持久化映射确保不再使用相同的数字。 即使您使用不断变化的数据集多次执行该过程,此策略也会为您提供一致的结果:第一次出现的字符串将收到其私人号码,此私人号码将永久保留给它 - 数字是不再使用永远不会被重复使用。

更具挑战性的问题是:如果没有持久映射的帮助,是否有可能保证唯一性?我担心不是,因为尺寸减小总是容易导致碰撞。