我有一组字符串,每个字符串的长度相同(10个字符),具有以下属性.
集合的大小约为5000-10,000个字符串.数据集可以经常更改.
尽管每个字符串都是唯一的,但是特定模式的子字符串会出现在大多数这些字符串中,而不必在同一位置.
Some examples are
123abc7gh0
t123abcmla
wp12123abc
123abc是出现在大多数字符串中的子字符串
问题是将每个字符串映射到较短的字符串,并且这种映射应该是确定性的.
我可以使用一个简单的枚举算法,将遇到的每个字符串映射到一个递增的计数器值(在一组排序的字符串上).但是由于集合必然会频繁更改,因此我无法使用此算法以确定性的方式针对各种运行计算地图.
我还可以使用霍夫曼编码等数据压缩算法来压缩每个字符串.但是我不相信这样会有效,因为每个字符串本身具有很少的重复字符.
我应该利用数据集的属性来解决问题的方法是什么?请注意,我不想压缩整个数据集,但想将集合中的每个字符串映射为一个缩短的字符串.
解决方法:
>将“公用字符串”替换为任何其他字符串中未出现的字符.
>对所有字符串进行概率分析
>根据分析结果创建一个哈夫曼树,即最频繁出现的字符在树的顶部,从而产生短代码.
>根据#3树将其替换为hufman编码,并将结果大小与原始字符串进行比较.如果即使在字符串之间大多数字符也均匀分布,则哈夫曼编码不会减少而是会增加大小.
如果Hufman没有任何改善,则可以尝试使用LZW或任何其他基于字典的压缩方法.但是,这仅在字符串的结构(即字符/子字符串的分布)未随时间完全改变的情况下有效.例如,如果字符串由英文单词组成,则子字符串字典压缩(LZW)可能是不错的选择.
但是,如果分布改变或字符分布在所有字符上均相等,恐怕没有适合减小字符串大小的压缩方法.
但是最后一个问题仍然是:为什么?为什么要压缩10000个字符串呢?
编辑:答案是:字符串用于创建文件夹名称(路径).由于总长度受限制,因此应尽可能紧凑.
您可能会尝试创建数据库(即字典)并将索引(例如以Base64编码)用作压缩字符串.假设最大字典大小为2 ^ 32-1,则最多可以提供5个字符.