繁体   English   中英

为什么访问数组中的元素需要恒定时间?

[英]why does accessing an element in an array take constant time?

假设我有一个数组:

int a[]={4,5,7,10,2,3,6}

当我访问一个元素时,例如a[3] ,幕后实际发生了什么? 为什么很多算法书籍(比如 Cormen 的书...)都说它需要一个常数时间?

(我只是一个低级编程的菜鸟,所以我想向你们学习更多)

数组实际上是通过内存位置(指针)知道的。 访问a[3]可以在常数时间内找到,因为它只是 location_of_a+3*sizeof(int)。

在 C 中,您可以直接看到这一点。 请记住, a[3]*(a+3) ——它在做什么方面更清楚(取消引用指针“3 个项目”)。

一个由 10 个整数变量组成的数组,索引为 0 到 9,可以在内存地址 2000、2004、2008、…2036 处存储为 10 个字,因此索引为 i 的元素的地址为 2000 + 4 × i。 这个过程需要一个乘法和一个加法。因为这两个操作需要恒定的时间。所以我们可以说访问可以在恒定的时间内执行

只是为了完成,“在线性时间内访问什么结构?” 链表结构在线性时间内被访问。 要获得第n元素,您必须遍历n-1先前的元素。 你知道,就像录音机或 VHS 磁带一样,你必须等待很长时间才能走到磁带/VHS 的尽头:-)

数组更类似于硬盘:每个点都可以在“恒定”时间内访问:-)

这就是计算机的 RAM 被称为 RAM:随机存取存储器的原因。 如果您知道其地址,则无需遍历该位置之前的所有内存,就可以前往任何位置。

有些人告诉我,HD 访问并不是真正的固定时间(访问我的意思是“时间定位头部并读取 HD 的一个扇区”)。 我不得不说我不确定。 我已经用谷歌搜索了,我没有找到任何人谈论它。 我知道时间不是线性的,因为它仍然是随机访问的。 最后,如果您认为 HD 访问对您来说不够恒定(但是,什么是恒定的?RAM 的访问?考虑缓存、预取、数据局部性和编译器优化?),请随意考虑这句话因为数组更类似于 U 盘:每个点都可以在“恒定”时间内访问 :-)

“恒定时间”的真正意思是“不依赖于‘问题大小’的时间”。 对于“问题”“从容器中取出东西”,“问题大小”是容器的大小。

无论容器大小如何,访问数组元素所需的时间基本相同(这是一种简化),因为使用一组固定的步骤来检索元素:计算其在内存中的位置(这也是一种简化),然后检索内存中该位置的值。

例如,链表不能这样做,因为每个链接都指示下一个链接的位置。 要找到一个元素,您必须遍历所有以前的元素; 平均而言,您将使用一半的容器,因此容器的大小显然很重要。

因为数组是按顺序存储在内存中的。 所以实际上,当您访问 array[3] 时,您是在告诉计算机,“获取 array 开头的内存地址,然后将其加 3,然后访问该位置。” 由于添加需要恒定的时间,因此数组访问也是如此!

数组是相似类型数据的集合。 因此,所有元素都将占用相同数量的内存。因此,如果您知道数组的基地址和它保存的数据类型,您可以使用以下公式在恒定时间内轻松获取元素 Array[i]:

int takes 4 bytes in a 32 bit system.
int array[10];
base address=4000;
location of 7th element:4000+7*4.
array[7]=array[4000+7*4];

因此,如果您知道它所保存的基址和数据类型,则可以清楚地看到您可以在恒定时间内获得第 i 个元素。 请访问 链接以了解有关数组数据结构的更多信息。

数组是连续的,这意味着数组中下一个元素的地址与当前元素的地址相邻。 所以如果你想得到一个数组的第 5 个元素,你可以通过将数组的基地址与 5 相加来计算第 5 个元素的地址。这个直接地址现在直接用于获取该地址处的元素。

你现在可以在这里进一步问同样的问题——“计算机如何直接知道/访问计算出的地址?” 这就是计算机内存(RAM)的性质和原理。 如果您对 RAM 如何在恒定时间内访问任何地址更感兴趣,您可以在任何计算机组织文本中找到它,或者您可以直接搜索它。

如果我们知道需要访问的内存位置,那么这个访问是在常数时间内。 在数组的情况下,内存位置是通过使用基指针、元素索引和元素大小来计算的。 这涉及需要恒定时间执行的乘法和加法运算。 因此数组内的元素访问需要恒定的时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM