论文部分内容阅读
枚举有两层含义:一是计数,即计算具有某种特性的所有对象的个数;二是生成,即产生具有某特性的所有对象。本文主要介绍了二叉树的枚举,最大值堆的枚举和自己所研究的左倾堆的枚举。二叉树是一种重要的数据结构。二叉树枚举的研究无论在算法理论上还是在实际应用中都具有重要的意义。与二叉树枚举计数相关的最有名的就是Catalan数。目前二叉树的枚举生成主要是基于编码的二叉树生成算法,这些算法建立了二叉树集合和编码集合间的一一对应关系,将二叉树的枚举生成问题转化为编码的枚举生成问题。最大值堆在结构上是一棵完全二叉树。最大值堆的枚举生成是将数值映射到结构固定的完全二叉树上。目前最大值堆的枚举生成大都是基于回溯法,并采用单个数判断法和层次判断法来减少回溯的次数。左倾堆是具有堆序性质和左倾性质的特殊二叉堆。它可以作为优先队列的一种实现方式,跟普通的二叉堆相比,有着更加高效的合并操作。左倾堆的枚举对于研究左倾堆的性质、分析其相关算法的平均复杂性有着重要意义,并为左倾堆的随机生成提供了基础。本文首先根据左倾堆的距离和结点数的关系,用组合方法推导出了左倾堆枚举计数的递推公式,然后提出了基于构造的左倾堆枚举生成算法和基于排列的左倾堆枚举生成算法。基于构造的左倾堆的枚举生成算法是在含n-1个结点的左倾堆中插入一个结点构造所有含n个结点的左倾堆;基于排列的左倾堆枚举生成算法的依据是本文提出的一个定理,即一个二叉堆的中序序列能够唯一的确定该二叉堆。该定理确立了一个含n个结点的二叉堆与一个n元排列的一一对应关系。基于排列的左倾堆枚举生成算法通过生成n元排列,将排列看成是二叉堆的中序序列,通过中序序列来构造二叉堆,再从二叉堆中筛选出左倾堆,该算法简化了左倾堆的枚举过程,相对比基于构造的左倾堆的枚举生成算法,左倾堆的枚举生成效率提高了35%以上。同时本文进一步改进了基于排列的左倾堆枚举生成算法,使得左倾堆的枚举生成效率进一步提高了40%左右。本文最后对三种结构的枚举进行了总结,对左倾堆枚举生成的进一步改进方法进行了讨论。