Вот простая неизменяемая структура данных, которая поддерживает конкатенацию с постоянным временем.Это просто показывает, что это возможно, но не предназначено для практического использования.Реализация items
для извлечения элементов имеет довольно плохое время выполнения и может быть легко улучшена путем обхода дерева с помощью итератора.
Мне интересно, существуют ли какие-либо более совершенные структуры данных?
sealed abstract class Tree[+T] {
def items: List[T]
def append[U >: T](v: U): Tree[U] = this append Leave(v)
def append[U >: T](other: Tree[U]) = Node(this, other)
}
case class Node[+T](val left: Tree[T], val right: Tree[T]) extends Tree[T] {
def items = left.items ++ right.items
}
case class Leave[+T](val value: T) extends Tree[T] {
def items = List(value)
}
case object EmptyTree extends Tree[Nothing] {
def items = Nil
}
object ConstantTimeConcatenation {
def main(args: Array[String]) {
val first = EmptyTree append 1 append 2 append 3
val second = EmptyTree append 4 append 5
val both = first append second // runs in linear time
println(both.items)
}
}