VCL.Net 之家

探讨VCL.Net的技术,特别是从VCL迁移到VCL.Net的经验和技巧

导航

[Sorting Hierarchical Data in Database ] 补充

日前发现一个很好的树状数据的算法[http://www.sitepoint.com/print/hierarchical-data-database,作者Gijs Van Tulder],想对它做些补充。

在这篇文章中已对单个节点的操作做出了详细说明,但未提到对分支的操作如移动、复制和删除。在这里我试图对此作一些拓展,使之更易懂、更完善。

首先,我们总结一下这个算法的精髓。这个算法实际上是把象树这样一个立体的和层次结构的数据扁平化成一维的数据,然后用线性的算法就能够达到原来可能需要用递归算法才能达到的结果,从而提高了效率。可以用一句话来描述他的这个一维数据结构:给树的每个节点分配两个唯一的整数(左右编码),使得它的所有直接或间接的子节点的两个整数都落在于它的两个整数之间。有了这个描述,对于以分支为单位的操作就容易的多了。

1、删除:当删除节点所对应的纪录后,可以不对其他节点进行调整,整个树的编码依然是符合上面的描述的,如果想要编码的空间连续,只要把空出来的那一段之后的编码整个线性往前移就可以了。

2、复制:先算好新复制出来的节点所要占的编码个数,在它插入点之后的编码线性后移,留出足够的编码空间给新节点。

3、移动:由于要保证编码的唯一性不被线性移动所破坏,所以安全的做法是先做一个复制动作,再做一个删除动作。具体说就是1、先扩充编码空间(复制动作),2、直接修改移动分支的编码到新的编码空间,3、压缩2所留出的编码空间(删除动作)。

以上讨论的是一张表中只含一棵树的情况,实际上,有很多时候是一张表中存的是一个森林,这样可能就需要额外得来区分不同的树,以保证所作的操作都是针对同一棵树。当然也可以把所有的树统一编码,把他们放在连续的编码空间中,当作一棵大的虚拟的树。目前还没有实做过,无法比较出这两种的优劣。

posted on 2005-10-28 10:15  Bo Chen Lin  阅读(526)  评论(0编辑  收藏  举报