我有一个场景,我将更改列表推送到另一个系统。每个列表包含零个或多个插入、更新或删除的通知。
插入很容易;通知包含目标索引和指向项目的指针。更新很容易;我传递了一个指向该项目的指针。
删除似乎很简单;我需要传递要删除的项目的索引,但我怎么知道索引?索引从零开始并且必须是连续的,但我在插入时将它们组成。所以我需要跟踪我为每个项目组成的索引。
例如,我可以使用 map: 来做到这一点std::map<item*, int>
,但是当我删除一个项目时,我必须重新编号它之后的所有内容,即 O(N)。
这些项目列表将大到不能接受 O(N) 迭代的程度。我确定这个问题已经解决了,我只是不知道解决方案会被称为什么。搜索与“链表”相关的任何内容都会产生大量噪音。
一种可能的解决方案是跳过列表,其中子列表中的每个节点都知道它跳过了主列表中的多少节点,并且由于搜索跳过列表是 O(log N),我们可以随时跟踪并找到索引O(log N) 并删除 O(log N) 中的项目。
然而,在这里实现一个跳过列表似乎有点过头了......有没有更简单的解决方案?
编辑:
谢谢大家的建议,但我想我已经说服自己跳过列表是解决这个问题的正确方法。