如果我有要删除的元素的索引和要添加的元素列表,如何修改集合?

时间:2012-04-30 07:26:25

标签: algorithm collections

我有这样的功能

applyDiff(List orders, List ordersToAdd, int[] ordersToRemove) {
}

此函数应将orderToAdd的订单添加到orders并从orders中删除一些订单,要删除的订单的索引将在ordersToRemove数组中传递。

问题是:每次来自ordersToAdd的订单都会插入位置orders某处的posorderToRemove的所有索引都比pos更强大必须在1处增加。

我应该使用dinamically修改ordersToRemove数组吗?

当我应该同时添加 - 删除元素并且我有要删除的元素索引时,什么是通用“算法”或修改集合?

注意我不能在两个时间处理此任务(订单添加,订单删除),因为订单非常重要,其中的功能决定了应该添加和删除订单的顺序。

1 个答案:

答案 0 :(得分:0)

您没有明确指定如何确定插入的位置,以及int[] ordersToRemove的语义是什么(尽管对于后者我假设它是考虑到您的注释而删除的对象的索引)。但是我仍然可以建议一个“算法”,你会相应地应用它:

在方法indexIncrease中再引入一个变量。将其初始化为0。每次添加ordersToAdd都会增加此变量。每当您考虑来自int[] ordersToRemove的值时,不要只考虑此值,而应考虑ordersToRemove[i] + indexIncrease。因此,您将从ordersToRemove获取更新的值,而无需迭代整个数组并在每次添加后增加值。

请注意,应用此“alogrithm”可确保列表orders始终处于当前状态,但ordersToRemove根本不会更新。希望这对你有用。

编辑根据评论和完全更改的问题说明:

  • 如果您使用binary index tree,则可以省略ordersToRemove的所有元素的循环。有了它,每个修改的复杂性都变为O(log n),其中n是将存在的订单总数。
  • 考虑到输入限制,你给索引树比你已经拥有的强力解决方案要糟糕得多:每次迭代的元素数量都可以忽略不计,性能缺点是可以忽略的,索引树太多了虚假的复杂性。

总体而言:我建议您坚持使用当前的解决方案