我正在为一个大学项目实现一个基于文本的拼字游戏版本。
我的字典相当大,大约有400.000个单词(std::string
)。
如果我去找一个vector<string>
( O(n) ),就效率而言,搜索一个有效的单词会很糟糕。有什么好的选择吗?别忘了,我是大一新生。不要太复杂!
耽误您时间,实在对不起!
弗朗西斯科
发布于 2010-04-28 22:02:39
如果您想使用标准库中的内容,您可以使用std::set
,并将单词作为关键字。这会给你对数搜索时间。
由于您的字典可能是静态的(即只创建一次且未修改),因此您还可以使用std::vector
,使用std::sort
对其进行排序,然后在排序后的向量上使用std::binary_search
来查找单词。这也会给出对数搜索时间,并且可能比set
更节省空间。
如果你想实现你自己的数据结构,trie将是一个很好的选择。
发布于 2010-04-28 22:11:12
set对此很自然,因为除了使用向量之外,它几乎不需要任何工作。即便如此,我还是会教你一些你通常不会学到的东西,直到你成为一个专业人士。不要过早地进行优化。我在一台现代计算机上打赌,在40K字符串向量中查找线性字典只需要.001秒。
在一个集合中,它是O(log ),可能需要.00001秒。
任何不在STL中的东西都是在浪费时间。不要在一个10美分的问题上花费10美元。
发布于 2010-04-28 22:18:41
trie或radix tree将为您提供搜索时间和插入时间,它们与要搜索的字符串的长度成线性关系。
(请注意,对于任何搜索算法,您要搜索的字符串长度都是线性的,这是因为比较或散列字符串的长度是线性的--因此,在二进制搜索、二叉树或线性搜索的运行时间中,通常会忽略字符串长度的线性部分。)
如果您的库中还没有这些解决方案,那么这些解决方案可能过于夸张了。
https://stackoverflow.com/questions/2730117
复制相似问题