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

可以说我有一个数组为:

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

当我访问a [3]之类的元素时,它实际上在幕后发生了什么?为什么许多算法书籍(例如Cormen书籍...)都说它需要固定的时间?

(我只是低级编程的新手,所以我想向你们学习更多)

asked 2020-08-12T01:28:17Z
8个解决方案
23 votes

有效地,通过存储位置(指针)知道该数组。 由于只是location_of_a + 3 * sizeof(int),因此可以在恒定时间内访问a[3]

在C中,您可以直接看到它。 请记住,a[3]*(a+3)相同-就其功能而言(在指针“ 3个项之上”),这一点更加清楚。

Reed Copsey answered 2020-08-12T01:29:04Z
17 votes

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

user3013127 answered 2020-08-12T01:29:24Z
14 votes

为了完整起见,“线性时间访问什么结构?” 链接列表结构以线性时间访问。 要获取n元素,您必须遍历n-1之前的元素。 您知道像磁带录音机或VHS盒式磁带一样,要到磁带/ VHS的末尾要花很长时间:-)

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

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

有人告诉我,高清访问并不是真正固定的时间(所谓访问,是指“放置磁头并读取HD的一个扇区的时间”)。 我不得不说我不确定。 我在Google周围搜索,却找不到任何人谈论它。 我确实知道时间不是线性的,因为它仍然是随机访问的。 最后,如果您认为高清访问对您来说不够恒定(但是,什么是恒定的呢?对RAM的访问?考虑缓存,预取,数据局部性和编译器优化?),请随意考虑以下句子: 因为阵列更类似于USB磁盘:在“恒定”时间内可以访问每个点:-)

xanatos answered 2020-08-12T01:28:38Z
8 votes

“恒定时间”实际上意味着“不取决于“问题大小”的时间”。 对于“问题”“从容器中取出东西”,“问题大小”是容器的大小。

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

例如,链接列表无法执行此操作,因为每个链接都指示下一个链接的位置。 要找到一个元素,您必须先遍历所有元素。 平均而言,您将使用一半的容器,因此容器的大小显然很重要。

Karl Knechtel answered 2020-08-12T01:29:54Z
6 votes

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

Phil answered 2020-08-12T01:30:15Z
3 votes

数组是相似类型数据的集合。 因此,所有元素都将占用相同的内存量。因此,如果您知道数组的基地址和它所保存的数据类型,则可以使用以下公式轻松地在恒定时间内获取元素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];

因此,如果您知道它的基地址和数据类型,则可以在固定时间内获得第n个元素,这一点清晰可见。请访问此链接以了解有关数组数据结构的更多信息。

Sunil Kumar Jha answered 2020-08-12T01:30:41Z
1 votes

数组是顺序的,这意味着数组中的下一个元素的地址与当前元素的地址相邻。 因此,如果要获取数组的第5个元素,可以通过将数组的基地址加5来计算第5个元素的地址。现在,直接地址直接用于获取该地址的元素。

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

nikhiltejadonkana answered 2020-08-12T01:31:07Z
1 votes

如果我们知道需要访问的内存位置,则此访问时间是固定的。 如果是数组,则使用基本指针,元素索引和元素大小来计算内存位置。 这涉及乘法和加法运算,需要花费固定的时间来执行。 因此,数组内部元素的访问需要固定的时间。

Narendra Kalekar answered 2020-08-12T01:31:28Z
translate from https://stackoverflow.com:/questions/7297916/why-does-accessing-an-element-in-an-array-take-constant-time