【发布时间】:2014-01-14 20:59:22
【问题描述】:
我对算法和数据结构感兴趣,有一个小问题。
我知道通用列表包含具有指向下一个单元格的指针的“单元格”,因此将元素“插入”到列表中需要 O(1)(恒定时间)。
但是,插入数组需要更长的时间。
问题: 普通的静态数组是如何构建的?它是内存上的多个相邻区域吗?这就是为什么它的单元格没有相互指向的指针吗?
谢谢!
【问题讨论】:
标签: arrays list pointers data-structures
我对算法和数据结构感兴趣,有一个小问题。
我知道通用列表包含具有指向下一个单元格的指针的“单元格”,因此将元素“插入”到列表中需要 O(1)(恒定时间)。
但是,插入数组需要更长的时间。
问题: 普通的静态数组是如何构建的?它是内存上的多个相邻区域吗?这就是为什么它的单元格没有相互指向的指针吗?
谢谢!
【问题讨论】:
标签: arrays list pointers data-structures
它是内存上的多个相邻区域吗?
是的。数组是一个连续的内存区域。
将元素插入特定位置时,需要将其后的每个元素向下移动 1 个空格。如果没有更多空格,您还必须潜在地创建一个新数组并复制所有元素。
这个 O(N) 插入时间的折衷是 O(1) 查找时间。 (称为随机访问)。因为你有一个指向内存开头的指针,并且你知道你想要的项目的索引,所以得到内存地址是一个简单的计算。
【讨论】:
我的朋友,我们知道数组在连续内存分配方案上工作,所以它总是在静态时间维护内存,并且就复杂性而言,它取决于它
喜欢
Operation Array Singly Linked List
Read (any where) O(1) O(n)
Add/Remove at end O(1) O(n)
Add/Remove in the interior O(n) O(n)
Resize O(n) N/A
Find By position O(1) O(n)
insertion at the beg. O(n) O(1)
【讨论】:
是的,正确的数组存储在连续内存中,该内存是静态的,在进程启动时分配,而不是在运行时分配
【讨论】: