我们应该使用哪种数据结构进行最快的顺序访问?
非同步数据结构是什么意思?有些人称向量同步,但有些没有。
可以以随机方式访问数组以及顺序访问,但只能在顺序访问中访问LL,因此当按顺序访问时,如何确定数组是快速还是LL?
答案 0 :(得分:1)
可以以随机方式访问数组以及顺序访问,但只能在顺序访问中访问LL,以便在顺序访问时如何确定数组是快速还是LL?
因为顺序访问,当以随机访问的方式实现时,与实际从开头到n
寻求的替代方案相比将是不变的,这在时间上是线性的。
对于具有随机访问权限的容器,元素n
的顺序访问可能如下所示:
cursor := getStartCursor()
cursor := cursor+n
getElementAt(cursor)
对于只具有顺序访问权限的容器,它必须如下所示:
cursor := getStartCursor()
for i = 0 to n:
cursor := getNextCursor(cursor)
getElementAt(cursor)
单个add
操作与算法复杂度的类别不同于n
解除引用。
作为一个类比,顺序访问将是一个复活节彩蛋,在没有找到前四条线索的情况下,你不能跳到第四个蛋;相比之下,每个鸡蛋的位置地图将使您能够随时按照原始顺序包括去任何您喜欢的鸡蛋。
答案 1 :(得分:1)
这三个项目都可以直接访问序列中的下一个项目。那说:
虽然向量,链表和双链表的顺序访问的复杂性可能相同;毫无疑问,矢量几乎总能提供最佳的真实世界性能。在考虑方法的性能时,需要考虑很多因素,而不仅仅是操作的O(n)或Θ(n)。
最新的C ++规范中的向量保证连续的内存分配(意味着项目在内存中紧跟在彼此之后),这意味着从内存中查找一个对象将导致附近的对象也被加载到L2和L1缓存(空间局部性)。这意味着访问同一向量中的后续项目会快得多,因为CPU不需要从内存中获取内容。
对于反向迭代,双链表和向量都会给你O(1)访问下一个(读取:上一个)项,但同样的问题也是如此。双链表必须进行多次操作才能到达下一个节点(但是它是固定数量的操作,因此是O(1)值),包括读取指向下一个对象的指针的值,并加载地址以访问其内容。向量总是占优势。
向量还允许您直接访问任何随机节点。双链接和单链接列表都不能这样做 - 你必须从头开始迭代(结束也是双链表的选项)才能获得随机索引。
基本上:99%的情况下,你应该使用矢量。永远不要依赖O(n)或Θ(n)来实现真实的性能,因为它隐藏了许多重要的指标。向量的缺点是,如果元素的数量超过预先保留的空间量,则向量必须调整大小(通常需要将所有数据的副本复制到新位置)。一定规模的智能预订可以缓解这个问题;并且通常使用链表来“解决”这个问题是过度热心的预优化,最终会伤害而不是帮助。
答案 2 :(得分:-2)
访问方向也很重要: 从前到后:所有这些都是相同的(虽然取决于矢量实现它可能更快一点 - 分配与增量)
如果您可能需要在两者之间进行反转:Double-Linked List和Vector(感谢Mahmoud指出这一点!)