Scala范围/区间图结构[关闭]

Posted

技术标签:

【中文标题】Scala范围/区间图结构[关闭]【英文标题】:Scala range / interval map structure [closed] 【发布时间】:2014-10-07 16:08:36 【问题描述】:

我的问题与Data structures that can map a range of keys to a value 中提到的几乎相同,但对于 Scala。

也就是说,我想要一个可变的非重叠一维范围系统 [a[i], b[i]) 映射到某种值 v[i]。完成此类工作的标准底层数据结构是红黑树。

我希望它拥有的操作,最好所有操作都应该具有 O(log n) 的复杂度:

通过指定范围内的任何点来查询并获取给定范围(开始、结束、存储值)或缺少范围 在此结构中插入一个新范围 从结构中删除范围

所以,我想到目前为止,我看到了以下变体,所有这些变体都有其缺点:

在Java's TreeMap 上滚动你自己的容器 - 快速且肮脏,但由于缺乏适当的维护,从长远来看可能很糟糕 使用 Guava 的 RangeMap - 可能,但在 Scala 集合世界中会很尴尬 尝试使用 Scala 的红黑树实现并尝试自己滚动,但是,我想这将非常困难,因为 Scala's TreeMap 是仅不可变的并且缺少简单的查找方法,例如 Java 的 TreeMap floorEntry

我在这里遗漏了什么吗?是否有使用以 Scala 为中心的 API 扩展基本 Scala 集合的类似 Guava 且维护良好的集合扩展库?

密切相关的问题:

Migrating Java TreeMap code to Scala? - 提到“只使用 Java 的 TreeMap”而忘记其他任何事情 此问题的 Java 版本: Data structures that can map a range of keys to a value Hashtable key within integer interval Using java map for range searches Java - Suitable data structure for search interval

【问题讨论】:

对于任意可比较的值,或仅用于 int/long 范围,您需要这个吗? 就个人而言,我会使用这些来计算虚拟内存范围,因此我的应用程序将是long 范围,但我认为在这里使用非通用方法没有多大意义 - 不喜欢它可以提供巨大的性能或空间提升。 你不能用map.from(x).firstKey()代替map.floorEntry吗? @maaartinus:你可以,但它仍然需要处理immutable. TreeMap - 你最终要么推出完整的实现,要么用mutable.TreeSet + mutable.Map 模拟它 => 它严重影响内存使用并在一定程度上影响性能。可能不值得付出努力。 在这张地图上需要做哪些操作?您是否需要使用索引进行查询并让它返回包含该索引的所有(甚至一个)范围以及相关值?因为那时你可能需要一个 R-tree。所有各种TreeMap 实现都不适合该用例。 【参考方案1】:

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

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

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

在Java 中只有40 lines 和Lombok(在Scala 中可能更少),我不会害怕任何维护。我只写了一个非常初级的test。

【讨论】:

以上是关于Scala范围/区间图结构[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

10-看图理解数据结构与算法系列(B+树)

C ++中巨大图的数据结构[关闭]

数据结构与算法Scala

数据结构-图

R语言基于forestplot包可视化森林图实战详解:美化的森林图:自定义字体设置置信区间坐标轴(刻度标签范围)无效线去除水平线辅助线box形状色彩等

数据结构线段树 (定义 & 点修改/区间查询)