【发布时间】:2015-02-18 09:53:46
【问题描述】:
我需要维护一个排序序列(可变或不可变——我不在乎),动态地将元素插入其中(以保持排序)并同样删除它们(因此,通过索引进行随机访问至关重要) .
我遇到的最好的事情是使用 2.11 中的 Vector 和 scala.collections.Searching,然后:
var vector: Vector[Ordered]
...
val ip = vector.search(element)
插入:
vector = (vector.take(ip.insertionPoint) :+ element) ++ vector.drop(ip.insertionPoint)
删除:
vector.patch(from = ip.insertionPoint, patch = Nil, replaced = 1)
在我看来并不优雅,而且我怀疑存在性能问题。有没有更好的办法?拼接序列对我来说似乎是一个非常基本的操作,但我找不到一个优雅的解决方案。
【问题讨论】:
-
"动态地将元素插入到它的中间(以保持排序)" 但是要知道将它放在哪里,无论如何你必须遍历列表直到那个点。这使得一个列表对于这个操作来说并没有那么糟糕(或者你可以二进制切分或其他东西,但无论如何,它不是一个 O(1) 操作)。当你删除的时候,你是按索引删除,还是按值删除,还是别的什么?
-
另外,
vector.take..vector.drop是.splitAt。但你可能想要.span (_<= element) -
@Paul 二进制搜索是 O(log N),这也很好。不需要遍历。 scala.collection.Searching 使用二进制搜索。删除是按索引。
标签: scala sorting collections