什么时候链表比循环缓冲区更受青睐?

时间:2018-12-10 16:13:52

标签: linked-list circular-buffer

在big-O运行时方面,似乎两个数据结构在“平均”情况下都具有:

  • O(1)插入/删除到开头和结尾
  • O(n)插入/删除到任意索引
  • O(1)查找开始和结束

循环缓冲区的优点:

  • O(1)查找,而不是任意索引的O(n)
  • 不需要创建节点,因此不需要在每次插入时进行动态分配
  • 由于更好​​的缓存预测,可以更快地遍历
  • 由于矢量化(例如,使用memmove)而进行的快速填充
  • 通常需要较少的空间(由于在链表中,对于每个节点,您必须对指向下一个和/或上一个节点的指针进行排序)

链接列表的优点:

  • 更容易将O(1)插入/删除到某个特定位置(例如,可以在链接列表的中间进行插入/删除)。循环缓冲区可以做到,但是更复杂
  • O(1)在最坏的情况下插入,与O(n)的循环缓冲区(需要增加缓冲区的情况)不同

基于此列表,在我看来,循环缓冲区在几乎每种情况下都是更好的选择。我想念什么吗?

1 个答案:

答案 0 :(得分:1)

MCS锁是现有的最具扩展性的锁设计之一。线程使用原子比较和交换来尝试获取锁。如果成功,那就完成了。如果不起作用,则该线程使用原子交换将自己排入等待者列表的末尾。

没有办法使用无锁的循环缓冲区或使用更复杂的原子指令来做类似的事情。