我有这样的功能
applyDiff(List orders, List ordersToAdd, int[] ordersToRemove) {
}
此函数应将orderToAdd
的订单添加到orders
并从orders
中删除一些订单,要删除的订单的索引将在ordersToRemove
数组中传递。
问题是:每次来自ordersToAdd
的订单都会插入位置orders
某处的pos
,orderToRemove
的所有索引都比pos
更强大必须在1
处增加。
我应该使用dinamically修改ordersToRemove
数组吗?
当我应该同时添加 - 删除元素并且我有要删除的元素索引时,什么是通用“算法”或修改集合?
注意我不能在两个时间处理此任务(订单添加,订单删除),因为订单非常重要,其中的功能决定了应该添加和删除订单的顺序。
答案 0 :(得分:0)
您没有明确指定如何确定插入的位置,以及int[] ordersToRemove
的语义是什么(尽管对于后者我假设它是考虑到您的注释而删除的对象的索引)。但是我仍然可以建议一个“算法”,你会相应地应用它:
在方法indexIncrease
中再引入一个变量。将其初始化为0
。每次添加ordersToAdd
都会增加此变量。每当您考虑来自int[] ordersToRemove
的值时,不要只考虑此值,而应考虑ordersToRemove[i] + indexIncrease
。因此,您将从ordersToRemove
获取更新的值,而无需迭代整个数组并在每次添加后增加值。
请注意,应用此“alogrithm”可确保列表orders
始终处于当前状态,但ordersToRemove
根本不会更新。希望这对你有用。
编辑根据评论和完全更改的问题说明:
ordersToRemove
的所有元素的循环。有了它,每个修改的复杂性都变为O(log n)
,其中n是将存在的订单总数。 总体而言:我建议您坚持使用当前的解决方案。