【发布时间】:2011-06-23 06:22:52
【问题描述】:
注意:下面的代码恰好是 C#,但实际上任何语言的答案都会对我有所帮助。
假设不是一个实际的集合(例如,List<T>),我有一个操作序列,每个操作看起来像这样:
struct ListOperation<T>
{
public enum OperationType { Insert, Remove }
public OperationType Type;
public T Element; // irrelevant for OperationType.Remove
public int Index;
}
有没有什么方法可以有效地根据一系列这样的操作“重建”一个集合?
特别是,我希望避免明显(低效)的实现,即基本上只为每个元素创建一个 List<T> 并调用 Insert 和 RemoveAt——这两个操作都是 O(N) 次。
更新:假设操作的“序列”实际上是一个具体的集合,其计数是已知的,并且可以通过索引随机访问(例如,像 ListOperation<T>[])。还假设 resulting 集合的实际计数是已知的(但实际上,无论如何,通过计算插入和删除,这在 O(N) 中是微不足道的)。还有其他想法吗?
【问题讨论】:
-
是否可以从头到尾阅读或仅从头到尾阅读?
-
顺便说一句,插入或删除可能是 O(1),最坏的情况是 O(n),但我想你知道
-
这是一个真棒的问题。我今天没有 + 投票,但我一定会在明天到来时尽快投票。
-
有趣。主要困难在于
Index与创建操作(插入/删除)时列表的当前状态有关。 -
@Rune FS:操作本身在任一方向上都是可读的。是的,我知道插入/删除 可能 很快;这是你提到的我试图避免的 O(n) 最坏情况。 @templatetypedef:谢谢;)我昨天在做一个项目时遇到了这个挑战,我个人觉得它真的很有趣——认为把它带到 SO 是个好主意! @Matthieu M.:是的,这似乎确实是个大问题。我希望有一个聪明的方法来解决它,但是......无论如何,看起来我已经有了一些想法。
标签: performance algorithm data-structures collections language-agnostic