mar*_*nus 44
map使用红黑树作为数据结构,因此放在那里的元素是排序的,插入/删除是O(log(n)).这些要素至少需要实施operator<.
hashmap使用散列,因此元素是未排序的,插入/删除是O(1).元素至少需要实现,operator==你需要一个哈希函数.
Cas*_*Cow 39
hash_map使用哈希表.这在理论上是"恒定的"时间.大多数实现使用"碰撞"哈希表.现实中发生的事情是:
理论上说,如果你有足够大的表,操作是恒定的时间,即它不依赖于你拥有的实际元素的数量.当然,在实践中,你遇到的元素越多,碰撞就越多.
std :: map使用二叉树.没有必要为对象定义哈希函数,只需严格排序比较.在插入时,它向下递归树以找到插入点(以及是否有任何重复项)并添加节点,并且可能需要重新平衡树以使叶子的深度永远不会超过1.重新平衡时间也相对于树的深度,因此所有这些操作都是O(log N),其中N是元素的数量.
哈希的优点是复杂性树的优点是:
另一个问题std::map是它使用单个严格排序的比较函数,而返回-1,0或1的"compare"函数效率会更高,特别是对于最常用的键类型std :: string,已经实现了这个功能(它是char_traits::compare).(这种效率低下的前提是要检查x==y,检查,x<y然后y<x进行两次比较.每次查询只执行一次).
map是一棵红黑树,O(log(n))访问时间.hash_map(这不是标准的,但unordered_map将成为标准)使用(概念上)密钥的散列作为链表列表中的索引,因此具有最佳情况下的访问时间O(1)和最坏情况O(n).
见http://en.wikipedia.org/wiki/Red-black_tree
| 归档时间: |
|
| 查看次数: |
61599 次 |
| 最近记录: |