【问题标题】:Circular buffer with fast lookup/insert/remove具有快速查找/插入/删除功能的循环缓冲区
【发布时间】:2017-12-04 15:43:04
【问题描述】:

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

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

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

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

谢谢。

【问题讨论】:

  • 如果有帮助,在 Java 中这将是一个 LinkedHashSet.. O(1) 插入/查找/删除,具有可预测的迭代顺序。如果限制为,则可以通过简单地删除第一个元素来限制大小在插入时间附近点击..
  • 请出示您的代码。这会有所帮助。
  • @klutt 这有什么帮助?
  • 在 95% 的情况下,(可能不工作的)代码比帖子更能说明 OP 想要实现的目标。包括可以被利用的限制。
  • 好吧,恕我直言,这个问题似乎是其他 5% 的问题之一 - 解释得很好..

标签: c algorithm containers


【解决方案1】:

一种方法是使用:

  1. 一个包含 n 个元素的数组来存储项目
  2. 带有 n 个元素的 Fenwick tree 用于存储占用情况。

我们使用 Fenwick 树在元素存在时写入 1,如果元素不存在则写入 0。

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

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

【讨论】:

    猜你喜欢
    • 2013-01-11
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    相关资源
    最近更新 更多