Scala范围/区间映射结构
我的问题与中提到的几乎相同,但针对Scala 也就是说,我希望有一个不重叠的1D范围[a[I],b[I]的可变系统,它将映射到某种值v[I]。完成这种工作的标准底层数据结构是一个红黑树 我希望它具有的操作,最好所有操作的复杂性都为O(logn):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 collections的世界里会很尴尬
- 尝试使用Scala的红黑树实现,并尝试使用您自己的实现,但是,我想这将是相当困难的,因为这是不可变的,并且遗漏了直接的查找方法,例如Java的TreeMap
floorEntry
- -提到“只使用Java的TreeMap”,而忘记其他任何事情
- 此问题的Java版本:
RangeMap
。您所需要的只是一个三方法类,在它后面可以隐藏非scalaish集合
我很好奇,要推出我自己的基于JavaNavigableMap
的解决方案有多难,而且它非常简单:
- 定义包含(开始、结束、存储值)的类
- 使用将起点映射到相应的
MyValue
仅在Java中使用Lombok(在Scala中可能更少),我不会害怕任何维护。我只写了一个非常基本的东西。对于任意的可比值,或者仅仅对于int/long范围,您需要这个吗?就个人而言,我会使用这些来计算虚拟内存范围,因此我的应用程序将是
long
范围,但我认为在这里使用非泛型方法没有多大意义-n我不喜欢它能提供巨大的性能或空间提升。难道你不能使用map.from(x).firstKey()
作为map.floorrentry
的替代品?@maaartinus:你可以,但它仍然保持不变。TreeMap
-你要么推出完整的实现,要么用mutable.TreeSet
+mutable.map来模拟它。它严重影响内存使用,并在一定程度上影响性能ly不值得这么做。您需要在此映射上执行哪些操作?您需要使用索引进行查询,并让它返回包含该索引的所有(甚至一个)范围以及相关值吗?因为这样您可能需要一个R树。所有的树映射
实现都不适合该用例。