Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么是随机存取和顺序存取?_C++_Stl_Random Access - Fatal编程技术网

C++ 什么是随机存取和顺序存取?

C++ 什么是随机存取和顺序存取?,c++,stl,random-access,C++,Stl,Random Access,所以我很好奇,什么是随机访问 我找了一点,没找到多少。我现在的理解是容器中的“块”是随机放置的(如图所示)。随机访问意味着无论在什么位置,我都可以访问容器的每个块(这样我就可以读取位置5上的内容,而不必在之前遍历所有块),而使用顺序访问,我必须遍历第1、第2、第3和第4个块才能到达第5个块 我说得对吗?或者如果没有,那么有人能向我解释什么是随机访问和顺序访问吗?顺序访问意味着访问第五个元素的成本是访问第一个元素的成本的5倍,或者至少与集合中的元素位置相关联的成本在增加。这是因为要访问集合的第5个

所以我很好奇,什么是随机访问

我找了一点,没找到多少。我现在的理解是容器中的“块”是随机放置的(如图所示)。随机访问意味着无论在什么位置,我都可以访问容器的每个块(这样我就可以读取位置5上的内容,而不必在之前遍历所有块),而使用顺序访问,我必须遍历第1、第2、第3和第4个块才能到达第5个块


我说得对吗?或者如果没有,那么有人能向我解释什么是随机访问和顺序访问吗?

顺序访问意味着访问第五个元素的成本是访问第一个元素的成本的5倍,或者至少与集合中的元素位置相关联的成本在增加。这是因为要访问集合的第5个元素,必须首先执行一个操作以查找第1、第2、第3和第4个元素,因此访问第5个元素需要5个操作

随机访问意味着访问集合中的任何元素与集合中的任何其他元素具有相同的成本。查找集合的第五个元素仍然只是一个操作

因此,访问随机访问数据结构中的随机元素将有O(1)成本,而访问顺序数据结构中的随机元素将有O(n/2)->O(n)成本。n/2来自,如果想要访问集合中的随机元素100次,该元素的平均位置大约是集合的一半。对于一组n个元素,结果是n/2(用大O表示法可以近似为n)

你可能会觉得很酷:

Hashmaps是实现随机访问的数据结构的一个示例。需要注意的一件很酷的事情是,在散列映射中的散列冲突中,两个冲突的元素存储在散列映射上该bucket中的一个顺序链表中。这意味着,如果一个哈希映射有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

我想先介绍一下我是如何理解顺序存储的优点/用例的,但我对顺序容器的好处的理解并不像我对上面的回答那样确定。所以,只要我弄错了,请纠正我

顺序存储很有用,因为数据实际上是按顺序存储在内存中的

通过将指向该数据集上一个元素的指针偏移存储该类型的单个元素所需的字节量,实际上可以访问顺序存储的数据集的下一个成员

因此,由于有符号整数需要存储8个字节,如果您有一个固定的整数数组,指针指向第一个整数:

int someInts[5];
someInts[1] = 5;
someInts是指向该数组的第一个元素的指针。向该指针添加1只会将其指向内存中的位置偏移8个字节

(someInts+1)* //returns 5
这意味着,如果您需要按特定顺序访问数据结构中的每个元素,那么速度会快得多,因为每次查找顺序存储都只是向指针添加一个常量值

对于随机存取存储,不能保证每个元素都存储在其他元素附近。这意味着每次查找都比只添加一个常量要昂贵

通过使用迭代器,随机访问存储容器仍然可以模拟看似有序的元素列表。但是,只要允许对元素进行随机访问查找,就不能保证这些元素在内存中按顺序存储。这意味着,即使容器可以同时显示随机访问容器和顺序容器的行为,它也不会显示顺序容器的优点

因此,如果容器中元素的顺序被认为是有意义的,或者您计划对数据集中的每个元素进行迭代和操作,那么您可能会从顺序容器中受益


事实上,它仍然变得有点复杂,因为链表(一个连续的容器)实际上并没有在内存中按顺序存储,而向量(另一个连续的容器)则会按顺序存储

这些术语本身并不意味着@echochamber所说的任何性能特征。这些术语仅指访问方法

“随机访问”是指以任意顺序访问容器中的元素<代码> STD::vector 是一个C++容器的例子,它对随机访问性能很好。代码> STD::Stase是一个C++容器的例子,它甚至不允许随机访问。 “顺序访问”是指按顺序访问元素。这仅与订购的容器相关。一些容器在顺序访问方面比随机访问方面优化得更好,例如
std::list

下面是一些代码来说明区别:

// random access. picking elements out, regardless of ordering or sequencing.
// The important factor is that we are selecting items by some kind of
// index.
auto a = some_container[25];
auto b = some_container[1];
auto c = some_container["hi"];

// sequential access. Here, there is no need for an index.
// This implies that the container has a concept of ordering, where an
// element has neighbors
for(container_type::iterator it = some_container.begin();
    it != some_container.end();
    ++ it)
{
    auto d = *it;
}

这有两个主要方面,不清楚哪一个更重要