【问题标题】:Scala vector splicing (maintaining sorted sequence)Scala向量拼接(保持有序序列)
【发布时间】: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


【解决方案1】:

您应该使用SortedSetSortedSet 的默认实现是 immutable red-black tree。还有一个mutable implementation

SortedSet[Int]() + 5 + 3 + 4 + 7 + 1
// SortedSet[Int] = TreeSet(1, 3, 4, 5, 7)

Set 不包含重复元素。如果您想计算重复元素,您可以使用SortedMap[Key, Int],将元素作为键并将计数作为值。使用Map 进行MultiSet 模拟,请参阅this answer

【讨论】:

  • 我会,但我需要能够添加多个相等的项目,并且在遍历序列时不要丢失它们。我可以用 SortedSet 做到这一点吗?
猜你喜欢
  • 1970-01-01
  • 2020-04-21
  • 2018-12-19
  • 1970-01-01
  • 2023-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-03
相关资源
最近更新 更多