Scala范围/区间映射结构

Scala范围/区间映射结构,scala,range,guava,red-black-tree,range-map,Scala,Range,Guava,Red Black Tree,Range Map,我的问题与中提到的几乎相同,但针对Scala 也就是说,我希望有一个不重叠的1D范围[a[I],b[I]的可变系统,它将映射到某种值v[I]。完成这种工作的标准底层数据结构是一个红黑树 我希望它具有的操作,最好所有操作的复杂性都为O(logn): 通过指定给定范围内的任何点,查询并获取给定范围(开始、结束、存储值)或缺少该范围 在此结构中插入一个新范围 从结构中删除范围 因此,我想到目前为止,我看到了以下几种变体,它们都有其缺点: 把你自己的容器放在上面——快速又脏,但由于缺乏适当的维护,

我的问题与中提到的几乎相同,但针对Scala

也就是说,我希望有一个不重叠的1D范围[a[I],b[I]的可变系统,它将映射到某种值v[I]。完成这种工作的标准底层数据结构是一个红黑树

我希望它具有的操作,最好所有操作的复杂性都为O(logn):

  • 通过指定给定范围内的任何点,查询并获取给定范围(开始、结束、存储值)或缺少该范围
  • 在此结构中插入一个新范围
  • 从结构中删除范围
因此,我想到目前为止,我看到了以下几种变体,它们都有其缺点:

  • 把你自己的容器放在上面——快速又脏,但由于缺乏适当的维护,长期来看可能不好
  • 使用番石榴是可能的,但在Scala collections的世界里会很尴尬
  • 尝试使用Scala的红黑树实现,并尝试使用您自己的实现,但是,我想这将是相当困难的,因为这是不可变的,并且遗漏了直接的查找方法,例如Java的TreeMap
    floorEntry
我遗漏了什么吗?是否有任何像Guava一样维护良好的集合扩展库使用以Scala为中心的API来扩展基本的Scala集合

密切相关的问题:

  • -提到“只使用Java的TreeMap”,而忘记其他任何事情
  • 此问题的Java版本:

我很可能会封装Guava的
RangeMap
。您所需要的只是一个三方法类,在它后面可以隐藏非scalaish集合

我很好奇,要推出我自己的基于Java
NavigableMap
的解决方案有多难,而且它非常简单:

  • 定义包含(开始、结束、存储值)的类
  • 使用将起点映射到相应的
    MyValue

仅在Java中使用Lombok(在Scala中可能更少),我不会害怕任何维护。我只写了一个非常基本的东西。

对于任意的可比值,或者仅仅对于int/long范围,您需要这个吗?就个人而言,我会使用这些来计算虚拟内存范围,因此我的应用程序将是
long
范围,但我认为在这里使用非泛型方法没有多大意义-n我不喜欢它能提供巨大的性能或空间提升。难道你不能使用
map.from(x).firstKey()
作为
map.floorrentry
的替代品?@maaartinus:你可以,但它仍然保持
不变。TreeMap
-你要么推出完整的实现,要么用
mutable.TreeSet
+
mutable.map来模拟它。它严重影响内存使用,并在一定程度上影响性能ly不值得这么做。您需要在此映射上执行哪些操作?您需要使用索引进行查询,并让它返回包含该索引的所有(甚至一个)范围以及相关值吗?因为这样您可能需要一个R树。所有的
树映射
实现都不适合该用例。