arrays - 数组和散列映射在访问时如何保持恒定时间?

标签 arrays algorithm data-structures hash computer-science

具体来说:给定一个散列(或数组索引),机器如何在常数时间内获取数据?

在我看来,即使经过所有其他内存位置(或其他任何位置)也需要花费的时间等于经过的位置数(线性时间)。一位同事勇敢地试图向我解释这一点,但当我们开始讨论电路时不得不放弃。

示例:

my_array = new array(:size => 20)
my_array[20] = "foo"
my_array[20] # "foo"

对位置 20 中的“foo”的访问是恒定的,因为我们知道“foo”在哪个桶中。我们如何神奇地到达那个桶而不经过所有其他桶?要到达一个街区的#20 号房子,您仍然必须经过其他 19 号房...

最佳答案

How did we magically get to that bucket without passing all the others on the way?

“我们”根本不“去”桶。 RAM 的物理工作方式更像是在一个 channel 上广播桶的编号,所有桶都在该 channel 上收听,而其号码被调用的那个将向您发送其内容。

计算发生在 CPU 中。理论上,CPU 与所有内存位置的“距离”相同(实际上并非如此,因为缓存会对性能产生巨大影响)。

如果您想要详细信息,请阅读 "What every programmer should know about memory" .

关于arrays - 数组和散列映射在访问时如何保持恒定时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4686487/

相关文章:

javascript - jquery 如果在数组中找不到元素则添加元素

php - 合并对象数组中除一个值之外的重复项... php/mysql

c++ - 数据管理错误 C++

c++ - 我的 DFS 树 (C++) 的意外结果

c - 测试链表

JavaScript 从数组对象中获取值不起作用

c++ - 尝试比较递归和迭代算法

c# - 有趣的问题 : Organizing objects into bins based on common properties

c - 将混合数据读入 C 结构

c++ - 在 cv::Mat 中从 cv::Point 的 vector 转换轮廓