我打赌有人已经解决了这个问题,但是我的搜索没有结果。
我想将单词列表打包到缓冲区中,并跟踪每个单词的起始位置和长度。关键是,我想通过消除冗余来有效地压缩缓冲区。
例如:doll dollhouse house 这些可以简单地打包到缓冲区中,如dollhouse,记住doll是从位置0开始的四个字母,dollhouse是从0开始的九个字母,house是从3开始的五个字母。
到目前为止,我想到的方法是:
1.按长度从长到短排序:(dollhouse,house,doll) 2.扫描缓冲区以查看该字符串是否已存在作为子字符串,如果是,请记录位置。 3.如果不存在,请将其添加到缓冲区的末尾。
由于长单词通常包含较短的单词,因此这种方法效果很好,但应该可以做得更好。例如,如果我扩展单词列表以包括ragdoll,则我的算法会得出dollhouseragdoll,这比ragdollhouse不够高效。
这是一个预处理步骤,速度不是非常重要。O(n^2)是可以接受的。另一方面,我的实际列表有成千上万个单词,所以O(n!)可能行不通。
顺便提一下,这种存储方案用于TrueType字体的“名称”表中的数据,参见http://www.microsoft.com/typography/otspec/name.htm。
我想将单词列表打包到缓冲区中,并跟踪每个单词的起始位置和长度。关键是,我想通过消除冗余来有效地压缩缓冲区。
例如:doll dollhouse house 这些可以简单地打包到缓冲区中,如dollhouse,记住doll是从位置0开始的四个字母,dollhouse是从0开始的九个字母,house是从3开始的五个字母。
到目前为止,我想到的方法是:
1.按长度从长到短排序:(dollhouse,house,doll) 2.扫描缓冲区以查看该字符串是否已存在作为子字符串,如果是,请记录位置。 3.如果不存在,请将其添加到缓冲区的末尾。
由于长单词通常包含较短的单词,因此这种方法效果很好,但应该可以做得更好。例如,如果我扩展单词列表以包括ragdoll,则我的算法会得出dollhouseragdoll,这比ragdollhouse不够高效。
这是一个预处理步骤,速度不是非常重要。O(n^2)是可以接受的。另一方面,我的实际列表有成千上万个单词,所以O(n!)可能行不通。
顺便提一下,这种存储方案用于TrueType字体的“名称”表中的数据,参见http://www.microsoft.com/typography/otspec/name.htm。