我有一些类似的字典文件:
UTM University of Tennessee at Martin
UMD University of Maryland
这是一个3字母的缩写,后跟定义,用换行符分隔。 该文件总共有9282个定义。
我的问题是:
1)存储此定义的最佳方法是什么?我应该将它们放在一个地图中,在一个向量中,将它们存储在一个数组中,将它们保存在一个txt文件中并扫描它以寻找我需要的首字母缩略词吗?其他?速度是关键。 2)根据你的答案,我应该使用哪些函数来查找首字母缩略词然后只检索定义?
提前感谢您的帮助。
编辑/新相关问题:如果我不希望我的应用程序依赖外部txt文件,那么最好的方法是什么?
答案 0 :(得分:3)
std::map
很简单,是基本STL的一部分。这可能是你最简单的选择。
如果真的非常非常重要,那么你可以选择几个选项:
tr1::hash_map
或boost::unordered_map
)进行O(1)查找(它需要哈希)。 std::map
O(log n)查找vector<string>
(或vector<const char*>
)(假设首字母缩略词都是字母A-Z),并将首字母缩略词转换为索引。我猜测矢量选项(到目前为止)是最快的,但它也是最不明显的,最难维护的,并且难以扩展到更大的数据集。
您可以使用以下内容将const char *acronym;
转换为索引:
const char *vector_of_names[26*26*26];
// Input 3-letter acronym, outputs the associated name.
const char *getName(const char* acronym) {
return vector_of_names[
((acronyms[0]-'A') * 26*26) +
((acronyms[1]-'A') * 26) +
(acronyms[2]-'A')];
}
答案 1 :(得分:1)
如果速度很重要,哈希映射似乎是最佳选择。 Boost::Unordered中有一个。否则,std::map也可能有用。
您的其他选项似乎不太可能选择:将信息保存在文本文件中并在需要时进行扫描将非常慢(线性复杂性+磁盘访问)。未排序的向量可以实现更快的查找,但为什么呢?你想要一张地图,请使用一张。
答案 2 :(得分:1)
最快的查找可能是perfect hash table,它是提前构建的。这需要比其他解决方案更多的编码,因此在尝试之前请确保您需要它。
答案 3 :(得分:0)
您应该使用std::map
(#include <map>
)来提供关联单向查找,您的密钥是首字母缩写,而您的值是全名。
您可以使用insert
将您的元素放入,operator[]
可以访问它们。
有关详细信息,请参阅this reference。