【问题标题】:Maps faster than normal arrays?映射比普通数组更快?
【发布时间】:2016-12-07 12:32:31
【问题描述】:

带有char-type keys 的地图的访问时间是否比normal arrays 快?

我认为这是真的原因是因为普通数组有integer-type indexing,而我想到的地图有char-type indexing

整数是 4 字节,而字符只有 1 字节,因此有理由相信在给定 char 键处访问地图项比访问普通键更快给定整数索引处的数组项。换句话说,CPU 有更少的索引/键值字节来检查以确定数组中的哪个元素在内存中被引用。

【问题讨论】:

  • a) 不,假设使用字节索引比使用整数索引更快是不合理的(微基准待定) b) 首先如何实现映射?使用数组?
  • a) 我认为您混淆了您的术语。 b)据我所知,地图基本上是一个数组,因为它是索引项的列表。除了索引类型之外,唯一重要的是普通数组和 char 类型键控映射具有相同的内容类型(例如,int 数组的内容类型为 int)。如果我们假设 C++,我会使用无序映射。无论您使用哪种编程语言,都可以使用最快的地图类型。
  • 我建议您阅读更多关于关联数组(映射)和直接寻址数组之间的区别,然后重新表述问题。
  • std::unordered_map 是一个哈希表,它显然会比普通数组慢,因为它的实现要复杂得多。数组访问只是一个乘法+加法+内存获取操作,CPU 的速度非常快。对于哈希表,您需要计算哈希值,查找哈希桶中的条目并比较键(当然,这取决于特定的实现)

标签: arrays maps


【解决方案1】:

映射比数组慢。 因为,地图实际上是数组的实现。 但是对于更大量的数据,你可以使用 HashMap,因为你摆脱了比较(如果使用正确的话)。

【讨论】:

  • 所以普通数组基本上是任何高级编程语言中最快的项目列表?
  • @MånsNilsson 我很想回答“是”(前提是您的语言实现了直接寻址的数组),但实际情况要复杂得多。如果我们正在谈论“检索具有索引 i 的元素”,其中索引是连续整数,那么是的,你真的不能比直接寻址的数组更快。如果我们在混合中添加删除/插入/搜索或稀疏容器,答案会有所不同。关联数组和其他数据结构的存在正是因为“普通”数组在许多使用场景中不是最优的。
  • 这是否意味着地图项的检索速度较慢?例如。假设我们有一个包含三个整数的 int 映射“testst”,分别映射到键值“a”、“f”和“x”,以及一个包含三个元素的普通 int 数组“default”,这三个元素都已初始化。那么 test['f'] 是比 default[1] 更快的操作/命令吗?
猜你喜欢
  • 2011-09-16
  • 1970-01-01
  • 2014-11-29
  • 2011-06-01
  • 1970-01-01
  • 2012-02-09
  • 2021-06-11
  • 2018-12-10
  • 1970-01-01
相关资源
最近更新 更多