我有一个场景,我正在将更改列表推送到另一个系统。每个列表包含零个或多个插入,更新或删除的通知。查找链接列表中的条目优于O(n)时间的索引
插入很容易;该通知包含目标索引和一个指向该项目的指针。更新很简单;我传递一个指向该项目的指针。
删除似乎很直接;我需要传递要删除的项目的索引,但是如何知道索引?索引从零开始并且必须是连续的,但是我在插入时进行设置。所以我需要跟踪每件商品的指数。
我可以做到这一点,例如,地图:std::map<item*, int>
,但是当我删除一个项目时,我必须重新编号过去它的所有内容,这是O(N)。
这些项目列表将会大到O(N)迭代不可接受的程度。我确信这个问题已经解决,我只是不知道该解决方案将被称为什么。搜索与“链表”相关的任何内容都会产生大量噪音。
一个可能的解决方案是跳过列表,其中子列表中的每个节点都知道它跳过的主列表中有多少个节点,并且由于搜索跳过列表是O(log N),所以我们可以继续跟踪找到O(log N)中的索引并删除O(log N)中的项目。
然而,实施跳过列表似乎有点矫枉过正......有没有更简单的解决方案?
编辑:
感谢所有为您的建议,但我想我已经说服自己跳跃列表是在这里解决这个问题的正确方法。
在地图例子,你为什么要重用以前使用的索引/键?为什么不能拖延清理以前使用过的索引,直到达到std :: numeric_limits :: max()? –
2009-11-25 06:10:09
@Mads:因为他们需要为将来的更改通知连续。如果我在我的最后删除了某些内容,那么更改通知系统另一端的人员也会删除他对该项目的表示,并且我们希望在未来的更新和插入中进行同步。 – 2009-11-25 06:14:14
为什么不能简单地使用唯一的ID来完成?您删除ID为17的项目,他会做同样的事情,无论实际列表中的项目是什么,它可能是列表中的项目#5。 – 2009-11-25 12:14:55