Arrays 如何更有效地将词汇存储在数组中?

Arrays 如何更有效地将词汇存储在数组中?,arrays,algorithm,vocabulary,Arrays,Algorithm,Vocabulary,我有一个词汇,a,放弃z 出于某种原因,我将使用数组而不是Trie来存储它们 因此,一个简单的方法可以是:wordA\0wordB\0wordC\0…word\0 但我认为还有一些更经济的记忆方法 由于like是的子字符串,因此我们只能存储like的第一个位置和长度,而不是字符串本身。因此,我们生成一个“大字符串”,其中包含词汇表中的每个单词,并使用position[i]和length[i]获得i-第个单词 例如,词汇表包含三个单词ab、cd和bc。 我将abcd构造为“大字符串” 那么,如何生

我有一个词汇,
a
放弃
<代码>z

出于某种原因,我将使用数组而不是Trie来存储它们

因此,一个简单的方法可以是:
wordA\0wordB\0wordC\0…word\0

但我认为还有一些更经济的记忆方法

由于
like
的子字符串,因此我们只能存储
like
的第一个位置和长度,而不是字符串本身。因此,我们生成一个“大字符串”,其中包含词汇表中的每个单词,并使用
position[i]
length[i]
获得
i
-第个单词

例如,词汇表包含三个单词
ab
cd
bc
。 我将
abcd
构造为“大字符串”

那么,如何生成“大字符串”是解决这个问题的关键,有什么好的建议吗


我认为这个问题类似于TSP问题(旅行商问题),这是一个NP问题。

您要查找的搜索关键字是“字典”。i、 e.数据结构,可用于存储单词列表,并测试字典中是否存在其他字符串


您的想法比单独存储每个单词更紧凑,但远不如像DAWG这样的好数据结构紧凑。正如您所注意到的,如何最佳地选择如何重叠字符串并不明显。您所做的有点像无损压缩方案(如gzip)所做的。如果您不需要根据紧凑型词典检查单词,可以使用gzip或LZMA压缩已排序的单词列表。让他们的算法找到冗余并紧凑地表示

我查了查字典,找到了一个最近引起我兴趣的答案:

对于一本不需要即时添加新词的词典来说,a是最好的选择。通过跟踪图形节点,将字符串与其匹配,直到到达一个点,该点没有与下一个字符匹配的边,或者到达输入字符串的末尾,并发现DAWG中的节点被标记为有效的单词结尾。(而不仅仅是一些单词的前缀的子字符串)。有一些算法可以在合理的时间内从简单的单词字典数组中构建这些状态机

您的方法只能在整个单词是另一个单词的子字符串或一个单词的结尾或另一个单词的开头时利用冗余。DAWG可以在任何地方利用公共子字符串,而且匹配单词的速度也相当快。可能与二进制搜索数据结构的速度相当,尤其是当巨大的字符串太大而无法放入缓存时。(一旦开始超过缓存大小,数据结构的紧凑性就开始超过代码的复杂度以提高速度。)

较不复杂但仍然有效的是a(or),其中公共前缀被合并,但单词中的公共子字符串不会再次聚合


如果您根本不需要修改DAWG或Trie,那么可以将其高效地存储在单个内存块中,而不是动态分配每个节点。您没有说明为什么不想使用Trie,也没有承认存在比普通Trie更好的其他数据结构。

有没有理由不从现有数据库解决方案中获益?当然你可以发明你自己的。但是,这值得付出努力吗?@clq:我认为关系数据库不会将字符串表压缩到Trie或其他任何形式。如果我错了,请纠正我的错误,但是使用一个字符串字段作为主键的DB表可以对当前/不存在进行非常快速的索引检查,但可能比将它们全部背靠背存储在一个C字符串中要占用更多的空间。@对于纯C项目来说,clq数组更高效,更易于处理。@LTzycLT:更节省空间,但比使用现成数据库的时间效率更低。DB库将为您提供良好的性能,而无需花费大量的开发时间。trie有什么问题?你所说的结构对我来说似乎很有限制。。或者让我们换一种说法:它只能在非常特定的情况下获利。你举一个例子,其中on-word是另一个词的前缀——“like”和“like”。。但是如果他们只共享前缀呢。一瞬间“喜欢”和“喜欢”。数组应该如何有效地存储这两个单词?嗯,一个trie就很好了,我想……你读过OP的问题了吗?具体来说:
出于某种原因,我将使用数组而不是Trie
。他清楚地说明了他想要使用什么方法,而你没有回答这个问题:
如何生成“大字符串”
@fjardon:Oops,不,我在浏览时错过了这个。我只是更新了我的答案,以便更好地回答这个问题,或者至少指出他想要的与gzip之类的无损压缩方案类似(并建议使用它)。也许你可以看看这些来获得灵感。你是对的,这个答案并没有直接回答OP提出的问题,而是试图提出一些能以不同方式解决同一问题的建议。
position[0] = 0, length[0] = 2

position[1] = 2, length[1] = 2

position[2] = 1, length[2] = 2