Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C++;? 我是C++的一个完整的新手。我试图读取一个文件并构建一个查找表(更像是一个哈希表,只是为了检查字符串值的存在)。该文件包含大约30万个条目,我将使用这些条目构建一个查找表。在这之后,我将对这个进行大约100万次的查找。最有效的方法是什么?这是地图(谷歌的第一个结果)还是有更好的结构用于此目的?_C++ - Fatal编程技术网

如何在C++;? 我是C++的一个完整的新手。我试图读取一个文件并构建一个查找表(更像是一个哈希表,只是为了检查字符串值的存在)。该文件包含大约30万个条目,我将使用这些条目构建一个查找表。在这之后,我将对这个进行大约100万次的查找。最有效的方法是什么?这是地图(谷歌的第一个结果)还是有更好的结构用于此目的?

如何在C++;? 我是C++的一个完整的新手。我试图读取一个文件并构建一个查找表(更像是一个哈希表,只是为了检查字符串值的存在)。该文件包含大约30万个条目,我将使用这些条目构建一个查找表。在这之后,我将对这个进行大约100万次的查找。最有效的方法是什么?这是地图(谷歌的第一个结果)还是有更好的结构用于此目的?,c++,C++,基于此场景,您可能还想看看试试: 一般来说,哈希表是好的,但是如果你想要“最有效的方法”,你必须提供更多的细节。map有log(n)查找,但是你可以按照你的建议,用哈希表实现O(1)。它看起来像是STL实现了一个名为的函数。C++std::map不是哈希表,但如果需要,可以将其用于查找表 < >由C++标准保证的性能特征为: O(logn)用于搜索元素 O(logn)用于插入新元素 O(日志n)用于删除元素 肯定会有内存开销,因为std::map通常是用树(很可能是红黑树)实现的,并且映射中

基于此场景,您可能还想看看试试:


一般来说,哈希表是好的,但是如果你想要“最有效的方法”,你必须提供更多的细节。

map
log(n)
查找,但是你可以按照你的建议,用哈希表实现
O(1)
。它看起来像是STL实现了一个名为的函数。

C++
std::map
不是哈希表,但如果需要,可以将其用于查找表

< >由C++标准保证的性能特征为:

  • O(logn)用于搜索元素
  • O(logn)用于插入新元素
  • O(日志n)用于删除元素
肯定会有内存开销,因为
std::map
通常是用树(很可能是红黑树)实现的,并且映射中的每个节点都会保留指针


为了获得更好的性能特征,如果只想检查字符串值的存在性,可能需要查看,因为没有任何键值对。请参阅文档。

如果你最关心的是查找时间(听起来好像是这样),强烈地考虑一下。摊销查找时间为O(1),这明显优于O(logn)处的常规映射。

您需要的是数据结构。字典广泛使用这种数据结构实现。此外,它有O(n)查找时间,其中n是字符串的长度,占用的空间更少。Trie具有快速搜索、插入和删除条目的功能。

如果您有一个非常好的哈希函数(数据集上没有冲突),并且只需要检查条目是否存在,则可以尝试使用位集(例如从)


我相信它可以减少内存需求,而且速度非常快。

哈希映射不是标准化STL的一部分。我知道GCC-C++在STD命名空间内提供了一个实现,VisualC++提供了一个STDEXT命名空间,但是实现并不能保证有那个容器。@ Kuropuuin:有标准化的哈希表实现(还)吗?如果没有,我想我们只能将就着找到的东西了。@Mark:你的意思是说哈希表现在是STL的一部分了吗?我得到了一个包含错误的文件,没有找到文件。@ Mark:哈希表被排除在当前的C++标准之外,我认为主要是因为委员会不希望人们担心哈希函数。但是,在C++0x-TR1中,将提供一个哈希表。如果您使用的是VC++2008/2010,则可以使用,但我不确定还有谁提供了实现。我只是想指出,STL中没有标准化的哈希表,以防询问者正在使用其他编译器,并开始想知道为什么我们谈论的东西不可用。:)@马克:不同的供应商为STL提供了不同的哈希映射扩展。因此,当TR1在2003年添加一个哈希映射时,它被命名为
unordered\u-map
。与所有TR1一样,如果您的供应商支持TR1,它也存在于
std::TR1::
名称空间中。(如果不是,有一个Tr1的实现。),也就是代码> unOrdEddiPMAP>代码>将是即将到来的C++标准的一部分(预计明年),然后将驻留在<代码> STD::/COD>适当的地方。一些供应商已经支持这一点。我建议不要使用非标准的、不可移植的
hash_-map
,它很可能会被放弃。
std::set
,就像
std::map
,有O(logn)个查找时间。
hash\u集
给出了O(1)个查找时间,但它还不在标准中。我也这么想,但我看到的唯一查找方法是
find()
,这是一个
O(logn)
操作@马克:是的,它是代码> O(log n)< />代码,但是所有的哈希容器都不是标准的一部分,所以我认为没有更好的替代品作为标准C++的一部分存在。如果OP可以使用编译器提供的扩展,那么hash_集在我看来肯定会更好!如果它来自谷歌,你知道它必须是高效的;)我们等0x等了这么久,现在已经不是0x了:p他们一定在用十六进制!缓存未命中的不可估计值会使一般答案无效。字符串中是否有特殊结构?这可能使您能够编写自己的哈希函数和相等运算符,这可能比使用故意使用的字符串值更快。@Jive:是这样,如果这很重要,请尝试使用哈希映射(使用不同的哈希函数)和映射,然后比较性能配置文件。+1以防冒泡到顶部,同样值得快速提及的是hashmaps,因此有一个很好的答案,其中包括这个基本建议。+1。对于30万个条目,将复杂性从元素的数量改变为元素的长度可能是值得的。这里很难说
无序集
或Trie中哪一个是最好的。当然,Trie应该更紧凑,但它涉及更多的取消引用(每个字母一个)。我想它也会强烈地依赖于搜索模式:Trie和二叉树一样喜欢有序搜索(或接近有序),因为节点在缓存中仍然是热的。