c++ - 恒定时间访问列表中的任意元素 (C++)

标签 c++ stdvector valarray constant-time

我目前正在研究一种算法的实现,我想证明它可以在恒定时间内工作,即使元素数量非常多。

不幸的是,我需要一个数据结构来存储元素。当元素的数量非常多时,但对于我的算法而言并非不合理的高,std::vector 和 std::valarray 都不会在恒定时间内访问任意元素 as you can see in this graph .

是否有更好的数据结构来存储这些值?是否有任何我可以实现的技术来实现恒定时间访问?

最佳答案

对于较高的 n 值,很可能是:

您遇到了缓存问题。在某些时候,每次内存访问都会错过缓存,从而导致更长的内存负载。

您正在遇到内存分页的缓存问题。现代计算机内存以树状结构组织。每个内存访问都通过该树,使每个内存访问 O(log n) 其中 n 是可寻址内存空间。你通常不会注意到它,因为那棵树的高度和良好的缓存。但是,对于非常高的 n 和随机内存访问,这可能会成为一个问题。

例如,我的一个 friend 证明了由于随机内存访问,计数排序算法具有 O(n log n) 时间复杂度。快速排序算法 - 作为比较 - 对内存的顺序访问非常好,并且分页开销要低得多。

底线是,您很可能会遇到架构/操作系统内存访问开销 - 除非您使用一些非常极端的方法(例如实现您自己的操作系统),否则您将无法克服这些开销。

关于c++ - 恒定时间访问列表中的任意元素 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42928989/

相关文章:

c++ - 为什么std::vector和std::valarray初始化构造函数不同?

c++ - OpenGL 纹理加载困境

c++ - 如何在不增加 vector 大小的情况下保留多维 vector ?

c++ - 奇怪的 C++ 编译错误与 valarrays

c++ - void Print(vector<string>) 函数不打印

c++ - 如何将 vector<string> 转换为 vector<char*>

c++ - 将数据从 std::vector 传递到 std::valarray 的最有效方法

c++ - 在类对象上 boost shared_ptr

c++ - 错误 LMK2019 : unresolved symbol/fatal error LNK1120: 1 unresolved externals

c++ - C++ 名称解析(和重载)规则列表