当前位置: 首页 > 知识库问答 >
问题:

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

太叔志文
2023-03-14

我有一个词汇表,a放弃,...,z

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

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

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

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

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

position[0] = 0, length[0] = 2

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

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

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

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


共有1个答案

罗宪
2023-03-14

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

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

我在字典里查找了一个最近引起我兴趣的SO答案:内存受限的字符串外部排序,并将重复项组合在一起

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

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

不太复杂但仍然有效的是Trie(或Radix Trie),其中公共前缀被合并,但单词中的公共子串稍后不会再次收敛。

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

 类似资料:
  • 我有一个关于字典存储的问题。 我在读Trie数据结构,到目前为止,我已经读到它作为前缀树工作得很好。但是,我来到Trie-DS是为了看看它是否能有效地减少通过同一个单词形成的字母排列的存储。 对于ex:单词“ant”、“tan”和NAT有相同的字母,但根据Trie的说法,它继续为这些单词创建两个独立的路径。我可以理解Trie是用来存储前缀和减少冗余的。但有人能帮我减少这里的冗余吗。我想的一种方法是

  • 问题内容: 我的主要问题是,我想检查具有相同SSN的某人是否在我们这里有多个帐户。当前,所有个人身份信息都经过加密,解密需要很短的时间。 我最初的想法是在数据库的用户列中添加一个ssn列。然后,我可以简单地执行一个查询,使所有具有ssn或用户A的用户。 我不想将ssn以明文形式存储在数据库中。我当时只是想以某种方式加盐并对其进行哈希处理。 我的主要问题是,这是否安全(或安全性如何)?有什么简单的方

  • 问题内容: 目前,我正在使用一项服务来执行操作,即从服务器检索数据,然后将数据存储在服务器本身上。 取而代之的是,我想将数据放入本地存储中,而不是将其存储在服务器上。我该怎么做呢? 问题答案: 这是我存储和检索到本地存储的代码的一部分。我使用广播事件来保存和恢复模型中的值。

  • 我正在开发一个MMO射击游戏,类似于Python 2.7中的疯狂之神游戏。 游戏的玩家数据将包括每个玩家佩戴的装备、玩家姓名等。因此,当他们注销角色时,他们的玩家数据将被永久保存和保存,当他们再次登录时,他们的玩家数据将被加载到游戏中。为了安全起见,我估计唯一玩家数据条目的数量将为100万个条目。 将所有球员数据存储在一个巨大的txt文件中,或者26个文件,或者26*26个文件中,效率会更高吗?排

  • 问题内容: 有没有一种方法可以将数组存储到mysql字段中?我正在创建一个评论评分系统,因此我想存储用户ID数组以防止进行多次投票。我将创建一个新表,其中包含评论ID和对此评论进行投票的用户ID数组。然后,我将加入评论表和该表,并检查当前用户ID是否存在于选民数组或注释中。如果是这样,将禁用投票图标。我想我会避免以这种方式在循环中使用mysql查询。 您碰巧知道更好的方法吗? 问题答案: 您始终可

  • 给定一个由整数和一个数字组成的数组,,对该数组执行左旋转。然后将更新后的数组打印为单行空格分隔的整数。 示例输入: 如何使用更少的内存来解决这个问题?