c++ - 在优于 O(n) 的时间内找到链表中条目的索引

标签 c++ data-structures algorithm time-complexity

我有一个场景,我正在将更改列表推送到另一个系统。每个列表包含零个或多个插入、更新或删除的通知。

插入很容易;通知包含目标索引和指向项目的指针。更新很容易;我传递一个指向该项目的指针。

删除似乎很简单;我需要传递要删除的项目的索引,但是我怎么知道索引呢?索引从零开始并且必须是连续的,但我在插入时将它们组合起来。所以我需要跟踪我为每个项目编制的索引。

例如,我可以使用 map 来做到这一点:std::map<item*, int> ,但是当我删除一个项目时,我必须重新编号过去的所有内容,这是 O(N)。

这些项目列表将大到无法接受 O(N) 迭代的程度。我确信这个问题已经解决了,我只是不知道解决方案会被称为什么。搜索与“链表”相关的任何内容都会产生大量噪音。

一个可能的解决方案是跳表,其中子列表中的每个节点都知道它跳过了主列表中的多少个节点,并且由于搜索跳表的时间复杂度为 O(log N),我们可以随时跟踪并找到O(log N) 中的索引并删除 O(log N) 中的项目。

然而,在这里实现跳过列表似乎有点矫枉过正……有没有更简单的解决方案?

编辑:

感谢大家的建议,但我想我已经说服自己跳过列表是解决这里问题的正确方法。

最佳答案

参见 Finger Trees: A Simple General-purpose Data Structure由 Hinze 和 Paterson 撰写。

另请参阅 MarkCC 的 blog post on finger trees 中的漂亮插图.

关于c++ - 在优于 O(n) 的时间内找到链表中条目的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1794919/

相关文章:

c++ - 用 C++ 发送带有附件的电子邮件

c++ - Gdiplus::来自字节数组的图像

c++ - OpenCV FAST 检测器

c - 多维数组如何在内存中格式化?

java - 在段落中和跨段落搜索

ruby - 深度优先搜索效率

c++ - 无法通过 C++ 获取 IME 输入上下文 (ImmGetContext)

c - C 是否有任何用于执行字符串添加的工具?

algorithm - 我怎样才能提高我的填充程序的性能?

python - 一个点在图的内部还是外部(顶点和边)?