解释为什么访问数组的第n个元素可以在连续列表的O(n)时间内以恒定时间O(1)完成?

时间:2017-04-30 06:08:44

标签: algorithm linked-list

这是关于我的作业的一个问题,我似乎无法回答它。有人能简单地向我解释一下吗?或者只是链表中O(1)和O(n)之间的差异?

2 个答案:

答案 0 :(得分:1)

对于数组,可以计算n元素的地址,因为数组是在连续的内存位置中分配的。因此,可以在O(1)时间内访问数组的元素。

对于链表,要访问n元素,您需要遍历链表以到达n元素。这种情况下的复杂性是n(您要访问的元素的数量)的函数。此外,可以在O(1)中访问链接列表的头部,因为head元素的地址已知。

答案 1 :(得分:1)

基础知识:所有变量在内部保存一个内存地址,指向保存变量数据的物理起点,

现在,变量的数据类型告诉我们将为存储在变量,int 4,long 8,char 4 ......中的地址位置所指向的数据分配多少空间。

数组变量只是相同数据类型值的连续分配,数组变量存储第一个数据的内存位置。

Arrays如何为任何索引提供O(1)提取:假设存在数据类型为X的N个元素的数组变量A,每个X数据类型在内存中占用m个大小,所以自动第一个元素将从A的存储位置到A + m,第二个元素将从A + m到A + m + m = A + m到A + 2m,因此公式为:

从内存位置开始的数组的第n个索引的内存位置在每个元素的内存中占用m大小

A+mxn

ergo其O(1)dip用于获取数组的索引。

使用Linked-List 的情况:LL不是连续的,每个元素都存储下一个元素的内存位置,因此您必须遍历从第一个到第n个元素的所有元素,因此它的O(N)。

值得注意的是,Array的空间复杂性取决于它所存储的数据类型,并且只能存储多个相同数据类型,数组中的插入只能在最后,而时间复杂度在其他地方插入元素的成本很高虽然在LLs中,空间复杂度依赖于它存储的数据,但它可以在每个元素中存储任何类型的数据而不管前一个元素,并且写入的时间复杂度总是为O(1),插入也简单易行。 / p>