我需要设计一种有效的方法来编码/解码包含Windows文件路径的多个字符串,例如具有有限长期存储的嵌入式系统上的C:\ Users \ Public \ Documents \ CompanyName \ ApplicationName \ VersionNumber \ Filename.ext。
目前,我们采用3个字符并将它们转换为单个唯一的整数,然后我们将其存储在其中一个寄存器位置。由于整个单元只有大约500个存储位置,因此很明显使用1个寄存器作为3个字符并不是一个好的解决方案。
应用程序工作流程:
注意:
这种编码/解码需要考虑哪些好的算法?
如果我忘记了任何重要细节,请告诉我。我试图尽可能彻底,但压缩绝对不是我的专长。
答案 0 :(得分:0)
由于路径名中有许多类似的前缀,您可以使用trie。这节省了大量空间,并且检索速度也很快。互联网上有许多免费实现,实现一个也很简单。
这里有更多解释为什么这是有用的。让我们将每个文件路径视为单个字符串。许多字符串都有共同的前缀,例如字符串C:\Users\Public\Documents\
将经常出现。即使你有像
C:\Users\Public\Documents\file1
C:\Users\Public\Documents\file2
.....
C:\Users\Public\Documents\file10000
然后整个前缀 C:\Users\Public\Documents\file
出现在许多文件中,我们不需要全部保存。但我们也不知道结构是怎样的(因为它是动态的而不是静态的)所以我们不能用硬代码来保存前缀 x 。但是,trie有助于在狭小的空间内保持整个琴弦。例如在每个非常庞大的文本搜索引擎中都有类似于trie的结构。因为它们不能保存所有行文本,因为它昂贵并且需要大量硬件,并且比这更重要,所以很难在数十亿行文本中找到特定文本。相反,他们使其结构像trie一样紧凑。
还有其他结构,如Huffman coding,这对于压缩巨大的字符串数据库相对有效,但在您的特定情况下,我认为您不仅仅是要压缩字符串,而是希望能够查询并快速找到相关信息。所以特里会有所帮助。
答案 1 :(得分:0)
将zlib与字典一起使用。更好的解决方案取决于了解嵌入式数据和程序的空间限制,更新数据和程序的成本,更新的频率和大小,更新到以前内容的相关性等。