【发布时间】:2016-05-11 03:21:24
【问题描述】:
对于我目前正在进行的一个研究项目,我需要做的任务之一如下:给定一个有根的、标记的、有向的树,我需要找到所有的子树重复 在这棵树内;换句话说,给定 all 树的子树(至少有一个节点),我需要将所有具有相同标签集的子树组合在一起 和 相同的层次结构结构体。例如,假设我们有以下树,其根为 A:
一种 / \ / \ 乙 |\ |\ C C B A | C在这种情况下,有几个重复的子树模式,比如下面……
模式 1(出现 3 次):
一种 | 乙 | C模式 2(出现 3 次):
一种 |\ 乙 | C模式 3(出现 2 次):
一种 | 乙...等等等等。仅供参考,我关注的“有根、有标签、有向树”是从 JavaScript 代码生成的抽象语法树 (AST)。
现在,我提出了自己的算法来查找所有子树重复。当 JavaScript 代码非常小时(因为 AST 也很小)时,它运行良好,并且算法立即完成。但是当我将 JavaScript 代码的行数增加到只有 10 行时,算法甚至在一个多小时后都没有完成执行! 所以我的问题是,有没有人知道一种更有效和可扩展的算法来查找所有子树重复?仅供参考,我实现该算法的语言也是 JavaScript。
供您参考,我当前的算法基本上是一种递归算法,它对树进行后序遍历(在这种情况下,后序的意思是“先访问该节点的子节点,然后再访问该节点”) .在每次节点访问时,算法通过遍历算法中早先确定的其子节点的子树的每个组合,找到以该节点为根的所有子树;对于它找到的每个以该节点为根的子树,该算法基于三件事计算一个哈希值:(1)节点的标签; (2) 出现在该子树中的节点的子节点数; (3) 当前出现在此子树中的子子树的哈希值。然后将散列到相同值的子树放置在同一组中。 (散列函数的潜在不准确性也需要解决,但我什至还没有到达那部分......)。
【问题讨论】:
标签: javascript algorithm performance tree abstract-syntax-tree