deque中元素的随机访问如何给出恒定的时间复杂度?

Alo*_*lok 3 c++

Deque为访问任何元素(cpp引用)提供了持续的复杂性.在向量中,它总是不变的复杂性(向量中的第一个元素的地址+没有元素)但是它如何用于双端队列?Deque元素不是连续的,那么它如何为访问任何元素提供O(1)时间复杂度?当我运行以下程序时,在向量的情况下它给出了正确的输出但是对于双端队列,它给出了一些任意数字(同意不给出正确的结果,因为元素不是连续的).

vector<int> v1;
deque<int> d1;
for( int i =0; i < 1000000;++i)
    v1.push_back(i);
for( int j =0; j < 1000000;++j)
    d1.push_back(j);
cout << *(&v1[0] +90000) << endl; // output 90000
cout<<  *(&d1[0] +90000)<<endl;   // Output is not the same as expected
Run Code Online (Sandbox Code Playgroud)

Sor*_*tir 6

deque通常实现为两层结构,顶层是指向固定大小块的指针数组.使用该大小的知识,确定哪个块保持感兴趣的项目和恒定的复杂性以确定正在请求块中的哪个项目是恒定的复杂性.

仅仅因为它是常量并不表示它总是一个简单的直接内存访问,只是对该特定操作的所有访问都需要相同的步骤.

  • “使用该大小的知识,确定哪个块保存感兴趣的项目是恒定的复杂性” - 如果这些块不是连续内存的一部分,您能解释一下如何进行吗? (2认同)
  • @Fei Xian,如果块已满并且您需要排队(在 O(1) 中)怎么办?您在“旧”第一个块之前创建一个新块,那么如何使用索引/块大小进行随机访问? (2认同)
  • @Peter这一点很清楚,我认为对于op来说也是如此,尽管它没有回答问题。 (2认同)
  • @Haimovitz博士在内存中,块彼此相关并不重要.查找指向任何块的指针是恒定时间,并且索引指针获取值是恒定时间.访问deque的任何元素都是一样的努力,n的值无关紧要.如果总是需要100次操作和10秒才能在虚构容器中找到任何值,访问仍然是O(1).它衡量的是复杂性,而不是时间. (2认同)