【问题标题】:Fastest pre-packaged key-value pair search最快的预打包键值对搜索
【发布时间】:2011-03-10 01:54:27
【问题描述】:

我想用c++实现如下数据结构(伪代码):

Map<Integer, Integer>    // Key->Value pairs

Map.put(1,6);
Map.put(2,5);
Map.put(6,89);
Map.put(7,23);
... etc ...

Map.get(2) .... returns 5

换句话说,给定一对整数,其中一个是查找键,让我从其中一个键中检索值的最快库实现是什么?不需要对Value->Key进行反向搜索。

此地图的大小可能约为 10 000 个元素。

我假设二叉树搜索会产生最快的查找时间? std:map 是最好的工具吗? boost 是否有任何替代方案?

【问题讨论】:

  • 通过预打包,我相信 OP 意味着数据结构的一些现有实现。并不是说关键值是事先知道的。只是发表评论,以免其他人像我一样误解它。

标签: c++ algorithm data-structures boost stl


【解决方案1】:

使用unordered_map(哈希图)或map(二叉树) - 可能unordered_map 会更快。此外,如果您的键值限制为 10000,vector&lt;int&gt; 将保证恒定时间查找 - 对应该“不存在”的向量元素使用“神奇”值。

unordered_map 是 TR1 和 c++0x 的一部分 - 它是 c++03 中的标准。但是,许多实现都支持它。 Boost 还有一个unordered_map

mapvector 都是标准的。

  • map 对应于 java TreeMap
  • unordered_map对应java HashMap
  • vector 对应于 java ArrayList

【讨论】:

  • 您能详细说明一下吗?这些模板类是标准库的一部分,还是 boost 的一部分?
  • 这些是标准模板类,但 unordered_map 是新的,可能在您的配置中可用,也可能不可用。
  • 误解,Value 不限于整数 10,000 ,而是限制为 10,000 个唯一的“值”。一般来说,hashmap 何时会优于二叉树?
  • 唯一正确的答案是,这取决于。在大多数情况下,如果您不需要按顺序访问元素,哈希表会更快。 en.wikipedia.org/wiki/Hash_table 详细介绍。
  • @J T:哈希表需要一个哈希函数:这些函数需要足够复杂,才能有效地将值均匀地分布在哈希桶中。这有多难取决于你的键的属性,但对于整数来说,它可能可以通过一些基本的算术运算来实现。在更多的桶(浪费空间,降低缓存效率)和更少的桶(更多的冲突,需要重新散列和/或位移和/或线性搜索)之间进行权衡。但是,即使您可能需要比您拥有的值多几倍的存储桶,内存也是连续的。
猜你喜欢
  • 2011-03-05
  • 1970-01-01
  • 2015-07-10
  • 2017-08-31
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
  • 1970-01-01
  • 2014-10-18
相关资源
最近更新 更多