Scala不可变Map像数据结构一样具有常量/有效常量查找

时间:2015-07-26 08:33:29

标签: json scala data-structures immutability scala-collections

在为Scala设计JSON AST时,我们意识到我们遇到了一个问题(这里可以更详细地描述https://github.com/json4s/json4s-ast/issues/8),理想情况下我们想表示JObject(JSON对象)使用保留其键的排序的Map结构或者使用具有常量或有效常量查找时间的默认Ordering按键排序。

我们需要保留排序或保证键被排序的东西的原因是当有人序列化JValue时,我们需要确保它总是为同一个JValue输出相同的JSON(最明显的情况是缓存JValue序列化)

问题是Scala stdlib似乎没有像数据结构这样的不可变Map,它通过O(c)或O(eC)查找时间(引用http://docs.scala-lang.org/overviews/collections/performance-characteristics.html)来保存/命令。 / p>

是否有人知道Scala集合库之后的Scala中是否存在此类数据结构的实现(或者即使存在这样的数据结构)?

2 个答案:

答案 0 :(得分:2)

一般情况下,您无法在固定时间内进行排序,因此使用Ordering就可以了。

实际上并没有任何我知道的不可变数据结构允许你在具有恒定性能的任意位置添加和删除(尽管有些人喜欢,但最好能得到O(log N)假设如果对数的基数足够大,它就会有效地保持恒定的状态")。

所以你要求的是不可能的。

但作为后备,TreeMap对于排序键并不好。对于O(log N)解决方案而言,它非常有效。

对于按正确顺序排列的键,通常需要维护三个映射:索引到键,索引键和值键。键的索引应为TreeMap,以便您可以按顺序行走。其他人可以是任何东西。基本思想是,当您想要添加键值对时,您可以增加索引并将(index - >键)添加到第一个映射,并将(key - > index)添加到第二个映射。然后,当您按顺序行走时,您沿着索引到键的地图走,并在键值映射中查找。当您按键删除时,您会找到带有键到索引映射的索引,因此您也可以从索引到键映射中删除它。

答案 1 :(得分:0)

经过与其他人的深思熟虑,似乎我们将维护2个数据结构(向量和地图,即https://github.com/json4s/json4s-ast/issues/8#issuecomment-125025604),这基本上是@Aivean所提到的。与潜在的内存使用相比,性能是一个更大的问题。

如果你需要订购,TreeMap确实是最快的结构,它有O(log(n)),没有排序你有标准的不可变Map,即O(n(n) log(n))(Haskell也有Data.Map,它的工作原理类似)。

感谢您的回答!