我有一组相同长度的字符串(10chars),具有以下属性。 该集的大小约为5000 - 10,000个字符串。数据集可以经常更改。 虽然每个字符串都是唯一的,但特定模式的子字符串会出现在大多数字符串中,而不一定在同一位置。
Some examples are
123abc7gh0
t123abcmla
wp12123abc
123abc
是大多数字符串中出现的子字符串
问题是将每个字符串映射到一个较短的字符串,这种映射应该是确定的。 我可以使用一个简单的枚举算法,它将遇到的每个字符串映射到递增的计数器值(在排序字符串集上)。但由于该集合必然会频繁更改,因此我无法使用此算法以确定的方式为各种运行计算映射。 我还可以使用像霍夫曼编码这样的数据压缩算法来压缩每个字符串。但我不相信这会有效,因为每个字符串本身的重复字符都少得多。 应该通过利用数据集的属性来适应解决问题的方法是什么?请注意,我不想压缩整个数据集,但希望将集合中的每个字符串映射到缩短的字符串。
答案 0 :(得分:1)
如果您可以预处理字符串集并且可以知道每个字符串中出现的模式,则可以将其视为单个字符(使用某种编码),这会缩短该字符串。
答案 1 :(得分:1)
如果Hufman没有获得任何改进,您可以尝试使用LZW或任何其他基于字典的压缩方法。然而,这仅在字符串的结构(即字符/子字符串的分布)不随时间完全改变时起作用。例如,如果字符串由英语单词组成,则子字符串字典压缩(LZW)可能是一个很好的候选者。
但是如果分布发生变化或字符分布仅仅等于所有字符,我恐怕没有适合缩小字符串大小的压缩方法。
但最后一个问题仍然存在:为什么?为什么要压缩10000个字符串呢?
编辑:答案是:字符串用于创建文件夹名称(路径)。由于总长度有限制,因此应尽可能紧凑。
您可能尝试创建数据库(即字典)并使用索引(例如编码为Base64)作为压缩字符串。假设最大字典大小为2 ^ 32-1时,这最多可以提供5个字符。
答案 2 :(得分:1)
我遇到了同样的任务,并想知道是否有可能在不使用持久性的情况下实现映射 。
如果允许
更具挑战性的问题是:如果没有持久映射的帮助,是否有可能保证唯一性?我担心不是,因为尺寸减小总是容易导致碰撞。