我正在开发一个启发式例程,需要维护一个已排序的序列/数组/列表。我听说timsort对于维护已经排序的子序列的序列的命令很快。
另一方面,我需要的是非常简单的。在最初对序列进行排序后,我需要在每一步重复执行以下操作之一:
删除min元素。
访问每个最小的K
元素。
插入一个元素并维护顺序。
timsort
似乎具有O(n)的最佳案例复杂性。天真地,我可以通过调用timsort
来获得O(n)来实现操作3。但是这些操作需要重复多次。我想知道手动维护排序序列(数组或列表)或在每一步执行partial_sort会更快,如果是,那么复杂性是什么。
对于披露,我使用c ++,c ++ / c ++ 11中的例子在必要时会很好。
谢谢,
答案 0 :(得分:1)
似乎最好的方法是实际使用自平衡二叉搜索树。这应该处理O(log N)中的插入/删除并迭代O(k)中的k个最小元素,如果我没有弄错的话。除非你有某些原因,否则你必须使用清单。