存储最快查找定义列表的最佳方法

时间:2010-06-30 19:12:13

标签: c++ dictionary lookup

我有一些类似的字典文件:

 UTM University of Tennessee at Martin
 UMD University of Maryland

这是一个3字母的缩写,后跟定义,用换行符分隔。 该文件总共有9282个定义。

我的问题是:

1)存储此定义的最佳方法是什么?我应该将它们放在一个地图中,在一个向量中,将它们存储在一个数组中,将它们保存在一个txt文件中并扫描它以寻找我需要的首字母缩略词吗?其他?速度是关键。 2)根据你的答案,我应该使用哪些函数来查找首字母缩略词然后只检索定义?

提前感谢您的帮助。

编辑/新相关问题:如果我不希望我的应用程序依赖外部txt文件,那么最好的方法是什么?

4 个答案:

答案 0 :(得分:3)

std::map很简单,是基本STL的一部分。这可能是你最简单的选择。

如果真的非常非常重要,那么你可以选择几个选项:

  • 使用哈希表(tr1::hash_mapboost::unordered_map)进行O(1)查找(它需要哈希)。
  • 使用std::map O(log n)查找
  • 创建一个包含26 ^ 3个元素的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