查找树对称性的算法

时间:2010-05-01 14:42:00

标签: algorithm combinatorics

我有n个扇区,逆时针枚举0到n-1。这些扇区之间的边界是无限分支(n个)。 这些部门生活在复杂的平面上,对于n平均而言, 扇区0和n / 2被实轴一分为二,扇区间隔均匀。

这些分支在某些点相遇,称为交叉点。每个交叉点与扇区的子集相邻(至少3个)。

指定交汇点(以预先修正的顺序,比如从邻近扇区0和1的交汇点开始),以及交汇点之间的距离,唯一地描述了树。

现在,给定这样的表示,我怎样才能看到它是否与实轴对称?

例如,n = 6,树(0,1,5)(1,2,4,5)(2,3,4)在实线上有三个连接点, 所以它与实轴对称。 如果(015)和(1245)之间的距离等于从(1245)到(234)的距离, 这也是假想轴对称的。

树(0,1,5)(1,2,5)(2,4,5)(2,3,4)有4个连接点,这在假想轴或实轴上都不是对称的,而是如果表示中前两个和最后两个交点之间的距离相等,则它具有180度旋转对称性。

编辑: 这里有所有树木,有6个树枝,距离为1。 http://www2.math.su.se/~per/files/allTrees.pdf

因此,给定描述/表示,我想找到一些算法来确定它是否是真实的,虚构的和180度旋转的对称。最后一个例子具有180度对称性。

编辑2: 这实际上是我的研究。我也在mathoverflow上发布了这个问题, 但我在竞赛编程中的日子告诉我,这更像是一个IOI任务。 mathematica中的代码非常好,但java,python或人类可读的任何其他语言都足够了。

(这些对称性对应于Schroedinger方程中的特殊种类, 它在量子力学中具有很好的性质。)

3 个答案:

答案 0 :(得分:1)

请您更好地定义树的对称性是什么意思?

你先说

  

“这些部门生活在这个综合体中   平面,对于n均匀,扇区0和   n / 2被实轴一分为二,并且   扇区间隔均匀。“

并且您想要找到对称性

  

wrt real,imaginary,rotation 180度

我希望对称性几乎是几何的,但是你也会在对贾斯汀的答案的评论中说,

  

也没有一种规范的方式来画树,   而我的绘图算法并不尊重所有可能的   树可以拥有的对称性

如果无法在平面上唯一定义树顶点的位置,您如何查找几何对称?此外,在你给出的许多图(N = 6,偶数)中,0和3的扇区没有被x轴(实轴)一分为二,所以我认为你自己的图错了。

答案 1 :(得分:0)

由于您已经有一个算法来构造树的点集,您只需要确定点集是否具有翻转对称性。理想情况下,对于非理性点,您的集合是按符号计算的(并且以sin(theta),cos(theta)表示),这应该没问题,因为您似乎使用了Mathematica。

您现在想知道您的点集是否具有关于某个轴的对称性,因此将翻转/旋转变换表示为矩阵 A ,并且我们有{x'} = A {X}。对后映像集{x'}进行排序(使用表达式而不是数值),并与原始点集{x}进行比较。如果没有1-1的对应关系,那么你没有对称性,否则你就没有对称性。

我认为有一个mathematica函数可以在集合中找到唯一的表达式(例如Unique [beforeImage] == Unique [afterImage])

答案 2 :(得分:0)

我没有时间实现这一点,也许这里有人可能会更进一步:

首先按象限划分交汇点,这应该产生4棵树。 {Tpp,Tmp,Tmm,Tpm}(p表示加号,m表示负数)。现在检查对称性似乎是一个有向广度的第一次遍历:

我的mathematica已经有一段时间了,所以这些都不会编译

CheckRealFlip[T_] := And[TraverseCompare[Tpp[T], Tpm[T]],
                         TraverseCompare[Tmp[T], Tmm[T]];
CheckImFlip[T_] :=   And[TraverseCompare[Tpp[T], Tmp[T]],
                         TraverseCompare[Tpm[T], Tmm[T]];

当TraverseCompare使用沿着一棵树的第一次遍历遍历检查树的结构,并且沿着另一棵树首先遍历逆序宽度。 (如下所示,但这不起作用)。

TraverseCompare[A_, B_] := Size[A] == Size[B] && 
  Apply[TraverseCompare, Children[A], Reverse[Children[B]];