显然有二进制字符串,长度。要遍历二进制,算法必须访问每个节点一次,即必须执行
步骤。 2 n 2 n ∑ i = 0 2 i = 2 2 n + 1 − 1 = O(4 n)4ñ2 n
∑我= 02 n2一世= 22 n + 1− 1 = O(4ñ)
让我们考虑一个递归算法,该算法遍历您描述的树,但是在其途中计算一和零的数量,即,它只会遍历树的大部分。
但是,有多少个这样的具有 0和 1的二进制字符串?我们为长度的字符串选择 1,并在步骤2中使用斯特林公式:
n n 2 n ( 2 nñññ2 n
( 2nñ) =(2n)!(n !)2= 4ñπñ---√(1 + O(1 / n ))
编辑
感谢Peter Shor的评论,我们还可以分析第二个算法所需的步数,该算法计算1和0。我从下面引用他的评论:
我们想找到所有正好为 0和 1的二进制序列。我们遍历二叉树,其中每个节点是一个最多 0和1的序列。我们不需要访问大于 0或大于 1的任何节点。我们需要访问多少个节点?有带有 0和 1的字符串。对所有求和得出。现在,我们需要以每个节点不变的平均成本访问这些节点中的每个节点。为此,我们可以先拜访每个左孩子,然后拜访每个右孩子。n 2 n n n ( i + jññ2 nññ我Ĵ我,Ĵ≤ÑΣÑ我= 0 ΣÑ Ĵ = 0 (我+Ĵ( i+j一世)一世Ĵ我,Ĵ ≤ Ñ∑ñ我= 0∑ñj = 0( i+j一世) =( 2n+2n + 1) -1
再次使用斯特林公式,我们得到
作为新算法的运行时间。
( 2 n + 2n + 1) -1=4n + 11个n + 1-----√(1 + O(1 / n ))− 1 = O(4ññ--√)