在c++中从字典文件创建映射的映射

Creating maps of maps from a dictionary file in c++

本文关键字:映射 文件创建 字典 c++      更新时间:2023-10-16

我有一个包含单词列表的文本文件(大约35 MB的数据)。我写了一个类似于Scrabble助手的应用程序。我发现将整个文件加载到一个集合中是不够的,因为这样做需要大约10分钟。我对c++不是很有经验,所以我想问你有什么更好的方法来实现它?在我的第一个版本的应用程序中,我只是通过二进制搜索它。因此,我设法通过对文件进行二进制搜索来解决这个问题(不加载它,只是使用seekg移动文件指针)。但是这个解决方案没有使用地图的地图那么快。当搜索一个单词时,我在地图上查找它的第一个字母。然后我检索可能的第二个字母的地图,并进行另一次搜索(查找第二个字母),依此类推。这样我就能更快地知道这个词是否在字典里。如果不将整个文件加载到程序中来制作这些地图,我如何才能实现它?我可以将它们保存在数据库中并读取它们吗?那样会更快吗?

35MB的数据很小。将所有内容加载到内存中没有问题,也没有理由花10分钟来加载。如果花了这么长时间,我怀疑你的加载方案是复制映射。

然而,与其解决这个问题,或者想出你自己的方案,也许你应该尝试一些准备好的东西。

你的描述听起来像是你可以使用嵌套结构的数据库。MongoDB,有一个c++接口,是一个可能的解决方案。

为了提高效率,您可以对方案进行一些花哨的设计。说最多5个字母的单词,你可以使用多键索引。除此之外,您还可以使用完全嵌套的结构。

只是不要自己去做。

首先,我同意Ami的观点,即35mb原则上不应该花那么长时间来加载和存储在内存中。是否加载代码有问题(例如意外复制映射,导致大量的分配/释放)?

如果我理解你的意图,你建立了一种trie结构(trienot tree)使用映射的映射,如你所描述的。如果在内存中,这可能非常好,但如果您只想在内存中加载部分地图,这将变得非常困难(不是从技术上做到这一点,而是确定加载哪些地图,哪些不加载)。这样就有可能从磁盘读取比实际需要更多的数据,尽管有一些持久化尝试的实现。

如果您打算在磁盘上使用索引方案,我宁愿建议您使用传统的B-tree数据结构,该结构旨在优化部分索引的加载。您可以自己编写,但已经有几个实现(参见这个问题)。

现在你也可以使用像sqlite这样的东西,它是一个轻量级的DMS,你可以很容易地嵌入到你的应用程序中。