顺序访问意味着访问第 5 个元素的成本是访问第一个元素的成本的 5 倍,或者至少与集合中的元素位置相关的成本增加。这是因为要访问集合的第 5 个元素,必须先进行一次运算,找到第 1、2、3、4 个元素,所以访问第 5 个元素需要 5 个运算。
随机访问意味着访问集合中的任何元素与集合中的任何其他元素具有相同的成本。找到集合的第 5 个元素仍然只是一个操作。
因此访问随机访问数据结构中的随机元素将花费 O(1),而访问顺序数据结构中的随机元素将花费 O(n/2) -> O( n) 成本。 n/2 来自于如果要访问集合中的随机元素 100 次,则该元素的平均位置将大约是集合的一半。因此,对于一组 n 个元素,结果为 n/2(在大 O 表示法中可以近似为 n)。
你可能会觉得很酷的东西:
哈希图是实现随机访问的数据结构的一个例子。需要注意的一件很酷的事情是,在哈希映射中的哈希冲突时,两个冲突的元素存储在哈希映射上该存储桶中的顺序链表中。所以这意味着如果你有 100% 的哈希映射冲突,你实际上最终会得到顺序存储。
这是一个哈希图的图像,说明了我所描述的内容:
这意味着哈希映射的最坏情况实际上是访问一个元素的 O(n),与顺序存储的平均情况相同,或者更准确地说,在哈希映射中找到一个元素是 Ω(n), O(1) 和 Θ(1)。其中Ω是最坏情况,Θ是最好情况,O是平均情况。
所以:
顺序访问:在 n 个元素的集合中找到一个随机元素是 Ω(n)、O(n/2) 和 Θ(1),对于非常大的数字,则变为 Ω(n )、O(n) 和 Θ(1)。
随机访问:在 n 个元素的集合中找到一个随机元素是 Ω(n/2)、O(1) 和 Θ(1),对于非常大的数字,则变为 Ω(n )、O(1) 和 Θ(1)
因此,随机访问的好处是可以为访问元素提供更好的性能,但顺序存储数据结构在其他方面也有好处。
@sumsar1812 的第二次编辑:
我想先说一下我是如何理解顺序存储的优点/用例的,但我对顺序容器的好处的理解不如我上面的答案那么确定。所以请在我错的地方纠正我。
顺序存储很有用,因为数据实际上会顺序存储在内存中。
您实际上可以通过将指向该集合的前一个元素的指针偏移存储该类型的单个元素所需的字节量来访问顺序存储数据集的下一个成员。
所以由于一个有符号的 int 需要 8 个字节来存储,如果你有一个固定的整数数组,并且有一个指向第一个整数的指针:
int someInts[5];
someInts[1] = 5;
someInts 是指向该数组的第一个元素的指针。向该指针添加 1 只会将其在内存中指向的位置偏移 8 个字节。
(someInts+1)* //returns 5
这意味着如果您需要以特定顺序访问数据结构中的每个元素,它会更快,因为每次查找顺序存储只是向指针添加一个常量值。
对于随机存取存储,不能保证每个元素都存储在其他元素附近。这意味着每次查找将比仅添加恒定数量更昂贵。
随机存取存储容器仍然可以通过使用迭代器来模拟看似有序的元素列表。但是,只要您允许对元素进行随机访问查找,就无法保证这些元素按顺序存储在内存中。这意味着即使一个容器可以表现出随机访问容器和顺序容器的行为,它也不会表现出顺序容器的好处。
因此,如果您的容器中元素的顺序应该是有意义的,或者您计划对数据集中的每个元素进行迭代和操作,那么您可能会从顺序容器中受益。
事实上,它仍然会变得更复杂一些,因为作为顺序容器的链表实际上并不按顺序存储在内存中,而作为另一个顺序容器的向量却可以。 Here's a good article that explains use cases for each specific container better than I can.