1
查找两个多项式之间的距离(表示为树)
一位从事基因编程工作的同事问了我以下问题。我首先尝试基于贪婪方法来解决它,但经过第二次思考,我找到了贪婪算法的反例。因此,我认为在这里值得一提。 考虑由它们的表达式树表示的两个多项式。例如,x3−2x+1x3−2x+1x^3-2x+1和x2+4x2+4x^2 + 4说明如下: 规则: 每个节点可以是变量名(x,y,z,…x,y,z,…x, y, z, \ldots),数字或运算符(+,-,×)。 树的有序遍历将导致有效的多项式。 操作节点的度数为2。其他节点的度数为0。所有节点的度数为1(除了root,其度数为0)。 在树的节点N上,如下定义基本操作: xxx××\times 基本操作可以在N之上构建一个表达式树(请参见下面的示例)。 类型1的基本操作的成本为1。类型2的成本等于新建的表达式树中{+,-,×}操作的数量。 类型2的示例:由于在节点N顶部构建的表达式树使用两个操作(-和×),因此以下基本操作的成本为2。 令T1和T2是代表多项式的两个表达式树。定义T1和T2 的距离如下:将T1转换为T2的基本操作的最低成本。请注意,我们不需要转换后的树具有与T2相同的结构。我们只希望它计算与T2相同的多项式。(有关示例,请参见注释。) 问题:给定T1和T2,提出了一种计算距离的算法。 示例1:假设T1和T2是本文开头所示的两棵树。要将右树转换为左树,可以在×的顶部构建成本为3的树,然后将4更改为1(总成本为4)。 x4x4x^4x4+4x3+6x2+4x+1x4+4x3+6x2+4x+1x^4+4x^3+6x^2+4x+1xxx(x+1)4(x+1)4(x+1)^4xxx4x34x34x^36x26x26x^24x4x4x