我对合并排序中的层数(树的高度)感到困惑。
在某些地方我可以看到它被赋予了$ \ log {2} {n} $的上限函数,但是在它被写成的地方是$ \ log {2} {n} + 1 $
谁能解释什么是正确的方法。
答案 0 :(得分:0)
当n不为2的幂时,需要使用上限函数来处理这种情况。
答案
How come the height of recursion tree in merge sort lg(n)+1
具有误导性,因为二叉树中的每个节点都由一个值和两个链接(两个都可能为空)组成,而递归自顶向下合并排序中的每个堆栈帧都由0个值和两个索引,迭代器或指针。
对于公式,是否可以检查调用者进行的子数组大小== 1的基本情况,包括初始调用,例如
if(end-begin > 1) call mergesort();
则公式为堆栈帧级别数=上限(log2(n))。
如果仅在mergesort的顶部检查基本情况,则公式为堆栈帧级别数= 2 + ceiling(log2(n))。考虑n = 7的情况,如果您包括对mergesort的初始调用,则共有5个级别的堆栈帧。通过自上而下的合并排序,递归将继续进行,直到子数组大小减小到一个元素的基本大小,在这种情况下,它将返回:
level
1 0,6
2 0,3 3,6
3 0,1 1,3 3,4 4,6
4 ret 1,2 2,3 ret 4,5 5,6
5 ret ret ret ret