O(1)在C ++中查找

时间:2012-05-06 19:53:30

标签: c++ data-structures stl std

C ++中的数据结构是否有O(1)查找?

std::mapO(log(n))个查询时间(对吧?)。

我正在寻找std中的某些东西(所以不是Boost pls)。此外,如果有,它是如何工作的?

编辑:好的,我猜不清楚。我希望将值与map中的值相关联。所以我想要std::map<int,string>之类的内容,findinsert应该O(1)

3 个答案:

答案 0 :(得分:10)

数组有O(1)查找。 c ++ 11的Hashtable(std :: unordered_map)具有O(1)查找。 (摊销,但或多或​​少不变。)

我还想提一下,像地图这样基于树的数据结构具有很大的优势,而且只有log(n),这往往是不够的。

回答你的编辑 - &gt;您可以逐字地将数组的索引与其中一个值相关联。哈希表也是关联的,但是完美的哈希(每个键映射到1个值)真的很难得到。

另外值得一提的是:数组具有很好的缓存性能(由于局部性,也就是说。元素彼此相邻,因此可以通过prefecthing引擎预取它们以进行缓存)。树木,不是那么多。使用合理数量的元素,哈希性能可能比渐近性能更重要。

答案 1 :(得分:4)

使用 O(1)查找的数据结构(忽略密钥的大小)包括:

  • 阵列
  • 哈希表

对于复杂类型,平衡树在 O(log n)处可以正常运行,或者有时您可以在 O(k)patricia trie >

供参考:complexity of search structures

答案 2 :(得分:3)

arrayO(1)次查询。