如何使用Scala中的其他关注点构建广度优先搜索遍历

时间:2016-12-28 22:04:14

标签: scala functional-programming breadth-first-search

如何使用缓存(每个节点访问一次)或距离等新问题撰写一个简单的breadth-first traversal图表。

与距离:

  def breadth_first_traverse2[Node](node: Node, f: Node => Seq[Node]): Stream[(Node, Int)] = {
    def recurse(q: Queue[(Node, Int)]): Stream[(Node, Int)] = {
      if (q.isEmpty) {
        Stream.Empty
      } else {
        val ((node, i), tail) = q.dequeue
        (node, i) #:: recurse(tail ++ f(node).map((_, i+1)))
      }
    }

    (node, 0) #:: recurse(Queue.empty ++ f(node).map((_, 1)))
  }
带缓存的

  def breadth_first_traverse[Node](node: Node, f: Node => Seq[Node]): Stream[Node] = {
    def recurse(q: Queue[Node], cache: Set[Node]): Stream[Node] = {
      if (q.isEmpty) {
        Stream.Empty
      } else {
        val (node, tail) = q.dequeue
        val nodes = f(node).filterNot(cache.contains)
        node #:: recurse(tail ++ nodes, cache ++ nodes)
      }
    }

    node #:: recurse(Queue.empty ++ f(node), Set.empty)
  }

我已经提出了这些实现。 问题是新的问题与简单的实现混合在一起,因此我无法构建具有缓存和距离的新实现。

如果我还想将路径从root返回到节点......

我想知道FP模式(例如StateTraverse)是否有帮助?

是否有更清洁设计的想法?

0 个答案:

没有答案