c++哈希表,其中键是字符串,值是字符串的向量
c++ hashtable where keys are strings and values are vectors of strings
我有一个庞大的唯一字符串集合(大约500k)。每个字符串都与一个字符串向量相关联。我目前正在中存储这些数据
map<string, vector<string> >
而且运行良好。然而,我希望对地图的查找比log(n)更快。在这些受限的情况下,我如何创建一个支持O(1)查找的哈希表?看来这应该是可能的,因为我提前知道了所有的钥匙。。。并且所有的密钥都是唯一的(所以我不必考虑冲突)。
干杯!
您可以使用boost::unordered_map
、std::tr1::unordered_map
或(在C++0x编译器上)std::unordered_map
创建哈希表。这几乎不需要付出任何努力。谷歌稀疏处理可能更快,而且占用的内存更少。(删除可能很痛苦,但似乎你不需要。)
如果代码仍然不够快,您可以像其他人所建议的那样,利用密钥的先验知识和最小的完美哈希来获得有保证的O(1)性能。代码生成工作是否值得取决于您;将500k个密钥放入像gperf
这样的工具中可能需要代码生成器生成器。
您可能还想看看CMPH,它在运行时生成一个完美的哈希函数,尽管是通过C API。
我想为您的表创建一个完美哈希函数。这将保证不会发生冲突,而冲突是解决成本高昂的操作。完美散列函数生成器也可用。
您想要的是一个完美哈希。gperf通常用于生成这些字符串,但我不知道它在处理如此大的字符串集合时效果如何。
如果您希望一个已知的密钥集合不发生冲突,那么您正在寻找一个完美的哈希。CMPH库(我很抱歉,因为它是针对C而不是C++的)是成熟的,可以为相当大的数据集生成最小的完美哈希。
相关文章:
- 在 C++11 中,如何查找并返回以给定字符串开头的字符串向量中的所有项?
- 在将字符串放入字符串向量时遇到问题?
- 如何从字符串向量构造对象并避免复制?
- 如何在目录及其子文件夹中构建文件名字符串向量?
- 当映射包含字符串向量作为值时,从值中获取键的有效方法
- 将字符串向量中的字符串放入主字符串中
- 如何在 c++ 中从字符串向量中读取
- 用字符串的向量分配字符串向量
- 如何使用 STL 算法将整数向量转换为字符串向量?
- C++ 中字符串向量的索引
- 如何根据第二列/第三列等对字符串向量进行排序?
- 如何从输入中获取字符串向量?
- 使用 C++-17,如何从字符串向量填充元组
- 对于循环增量器不能用作字符串向量的索引
- 我有一个返回字符串向量的函数.它需要两个字符串,并且返回一个字符串中缺少的字符串
- 如何从字符串向量中选择第 n 个位置?
- 如何将csv中的数据放入c++中的字符串向量中,而绝对没有任何作用
- 反转不带反转函数的字符串向量
- 如何在字符串向量中指向const int
- 如何在字符串向量中找到某个值