具有快速查找/插入/删除的循环缓冲区

时间:2017-12-04 15:43:05

标签: c algorithm containers

我遇到一个问题,我找不到足够有效的解决方案。我需要加速一个固定大小为1.000.000元素的循环缓冲区。它目前使用单链表实现。

目前,我已将实现更改为使用数组而不是链接列表。我使用写和读指针来避免移动我的数组的每个索引。我需要在我的fifo中做很多查找,我需要从索引中删除项目(好吧,我知道它违反了fifo规则)。

首先,我想到了一个与fifo数组匹配的排序索引表。这将是查找的O(log n)复杂度,但每次我需要更新我的fifo时,我还需要更新我的索引表。这是我无法有效完成的部分(复杂性很小)。

有关跟踪FIFO顺序的实现的任何提示,并在插入/删除/搜索操作中提供良好的性能?

感谢。

1 个答案:

答案 0 :(得分:1)

一种方法是使用:

  1. 包含n个元素的数组,用于存储项目
  2. 一个Fenwick tree,其中包含n个元素以存储占用率。
  3. 我们使用Fenwick树在元素存在时写入1,如果元素不存在则使用0。

    一旦有了这个结构,就可以找到第k个当前元素并在O(logn)时间内执行删除。 (由于FIFO环绕,实际的实现细节可能有点繁琐 - 它可能有助于跟踪数组中的总占用率以及从指针到第一个元素的占用情况,直到数组结束。)

    请注意,此结构允许您在任何地方删除项目,但只能在FIFO末尾插入项目 - 目前尚不清楚这是否符合您的要求?