今天在做ADS的project4(之前完成了project2:倒排索引 Inverted file index,project3:二叉堆 binary heap、左倾堆 leftist heap、斜堆 skew heap 的归并 merge):二项堆 binomial heap 与斐波那契堆 Fibonacci Heap 的节点值减小 DecreaseKey、归并 merge 与删除最小结点 DeleteMin。
发现merge之后的二项堆,并不是同level的结点都被链住。存在sibling为0但仍有同级结点的结点。导致一些有趣现象。于是开始计算:
一、指数为n的二项树,其中未链的条数?
以下所涉递归,均取n>1,防初始值异常。
T(n) = 2T(n-1) + (n+1) - 3
注意,n+1是level数,而3是无断链的层数(即头两层,以及底层)。
二、指数为n的二项树,其中sibling为0的结点数?
P(n) = 2P(n-1) - 1
此式可以考虑combine时(同指数merge),仅使那个被作为儿子的root的sibling指针非0。
也可以逆向考虑其补:~P(n) = 2~P(n) + 1。加1是因为,combine时多出一个sibling。这与正向考虑时一样。
其中,~P(n) = 2^n - P(n)
三、指数为n的二项树,第i层中,sibling为0的结点数?
这个问题,我没有整理出递归式,仅附思路,供读者自己写罢。
(一)观察到,每次merge,所有未链将在本层存留一份,再在下一层复制一份。以文章底部附图为例,考虑n=4。我们可以写出如下的未链记录:
2,2;3,2
表示第2层有2条未链;第3层有2条未链。
那么当n=5时,我们可以记录:
2,2;3,2;3,2;4,2
前两项,分别是n=4的2,2项的本层保留、下层复制;后两项,分别是n=4的3,2项的本层保留、下层复制。
(二)这并没有结束。merge后,将新增(n+1)-3条新链。注意合并(一)与(二)的结果,作为完整的新层的未链记录。
四、我们假设,每条未链将同级结点分割成若干断链。则:
1. 如上所述,对任意n>=2,头两层及底层,仅是一条整链。
2. 从顶至底(from root to leave),第一个有断链的层,其断链长度从左至右:n-1, n-2, ... ,1
3. 从底至顶,各层第一条断链的长度:1,2,3,...,n-1,n,1
4. (从左至右)(第i层各断链长度) ||(连接) (第i+1层各断链长度) 得:第n+1棵树的第i+1层各断链长度。
五、除root,有child等价于有sibling。
这些问题探究之后,还顺便复习了等差等比数列。猜测ADS考试会有所涉及。
后天参加C程校赛,祝精神正常。