【发布时间】:2018-06-04 19:59:54
【问题描述】:
对于函数式编程和代数数据类型的实验,我还是很陌生。我实现LinkedList如下:
sealed abstract class LinkedList[+T]{
def flatMap[T2](f: T => LinkedList[T2]) = LinkedList.flatMap(this)(f)
def foreach(f: T => Unit): Unit = LinkedList.foreach(this)(f)
}
final case class Next[T](t: T, linkedList: LinkedList[T]) extends LinkedList[T]
case object Stop extends LinkedList[Nothing]
object LinkedList{
private def connect[T](left: LinkedList[T], right: LinkedList[T]): LinkedList[T] = left match {
case Stop => right
case Next(t, l) => Next(t, connect(l, right))
}
private def flatMap[T, T2](list: LinkedList[T])(f: T => LinkedList[T2]): LinkedList[T2] = list match {
case Stop => Stop
case Next(t, l) => connect(f(t), flatMap(l)(f))
}
private def foreach[T](ll: LinkedList[T])(f: T => Unit): Unit = ll match {
case Stop => ()
case Next(t, l) =>
f(t)
foreach(l)(f)
}
}
问题是我想测量flatMap 操作的复杂性。
flatMap 的复杂性是O(n),其中n 是flatMaped 列表的长度(据我可以通过归纳证明)。
问题是如何以这种方式设计列表以使串联具有恒定时间复杂度?我们应该设计什么样的class extends LinkedList 来实现这一目标?或者其他方式?
【问题讨论】:
标签: scala data-structures linked-list time-complexity algebraic-data-types