【问题标题】:Complexity of linked-lists concatenation链表连接的复杂性
【发布时间】: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),其中nflatMaped 列表的长度(据我可以通过归纳证明)。

问题是如何以这种方式设计列表以使串联具有恒定时间复杂度?我们应该设计什么样的class extends LinkedList 来实现这一目标?或者其他方式?

【问题讨论】:

    标签: scala data-structures linked-list time-complexity algebraic-data-types


    【解决方案1】:

    一种方法是跟踪列表的结尾,并使列表节点可变,这样您就可以修改结尾以指向下一个列表的开头。

    我看不到使用不可变节点的方法,因为修改尾节点之后的内容需要修改它之前的所有内容。要获得与不可变数据结构的恒定时间连接,您需要的不是简单的链表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-04
      • 2014-07-23
      • 2020-05-05
      • 2016-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多