【问题标题】:Compare trees in Scala比较 Scala 中的树
【发布时间】:2014-05-24 19:00:25
【问题描述】:

假设我需要比较 Scala 中的树状数据结构(例如文件系统目录或 XML 文档)。如果我展平树来创建序列很容易,但它看起来很浪费内存。所以,我想把树弄平以创建迭代器/流。是否有意义 ?你会建议什么:迭代器或流?

【问题讨论】:

    标签: scala tree stream iterator


    【解决方案1】:

    如果您担心内存消耗,则应避免使用流。它们最终将分配与您正在遍历的节点一样多的内存。使用流类似于展平为序列,只是它是惰性完成的。

    使用迭代器可能会更好。然而,树迭代器可能难以实现。一个更简单且可能更有效的解决方案是在要比较的两棵树上简单地使用递归。例如:

    def compare(a: Tree, b: Tree): Boolean = {
      if (/* trees a and be are not equal */) false
      else if (a.children.length != b.children.length) false
      else {
        for ((c1, c2) <- a.children zip b.children) {
          if (!compare(c1, c2)) return false
        }
        true
      }
    }
    

    如果您担心性能,您可能希望摆脱上面的 for-comprehension,并使用 while 循环遍历子节点。

    【讨论】:

    • 谢谢。如果树非常大并且递归不可行怎么办。我应该实现一个树迭代器吗?
    • 如果树太大以至于由于堆栈溢出而导致递归不可行,那么您可以使用迭代器,或者您冷使用一对Stacks 来推送和弹出两棵树的节点并比较它们。
    猜你喜欢
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多