Knuth 的估计器 [1],[2] 是一个point estimate,它以任意有限树中的节点数为目标,无需遍历所有节点,即使树不平衡。 Knuth 的估计器是无偏估计器的一个例子; Knuth 估计器的期望值将是树中的节点数。话虽如此,如果所讨论的树不平衡,Knuth 的估计量可能会有很大的差异,但在你的情况下,由于每个节点都会有大约 N 个子节点,我认为 Knuth 的估计量的方差应该不会太大。当您尝试测量执行蛮力搜索所需的时间时,此估算器特别有用。
对于以下函数,我们将假设所有树都表示为列表的列表。
例如,[] 表示具有单个节点的树,[[],[[],[]]] 将表示具有 5 个节点和 3 个叶子的树(树中的节点与左括号一一对应)。以下函数是用 GAP 语言编写的。
函数simpleestimate 给出一个输出,估计树tree 中的节点数。 simpleestimate 背后的想法是我们随机选择从树的根 x_0 到叶子 x_n 的路径 x_0,x_1,...,x_n。假设 x_i 有 a_i 个后继者。然后simpleestimate 将返回 1+a_1+a_1*a_2+...+a_1*a_2*...*a_n。
point:=tree; prod:=1; count:=1; list:=[];
while Length(point)>0 do prod:=prod*Length(point); count:=count+prod; point:=Random(point); od;
return count; end;
函数estimate 将简单地给出通过多次应用函数simpleestimate(tree) samplesize 给出的估计值的算术平均值。
estimate:=function(samplesize,tree) local count,i;
count:=0;
for i in [1..samplesize] do count:=count+simpleestimate(tree); od;
return Float(count/samplesize); end;
示例: simpleestimate([[[],[[],[]]],[[[],[]],[]]]); 返回 15 而
estimate(10000,[[[],[[],[]]],[[[],[]],[]]]); 返回 10.9608 (树实际上有 11 个节点)。
估计搜索树大小。
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.129.5569&rep=rep1&type=pdf
估计回溯程序的效率。唐纳德·E·克努斯
http://www.ams.org/journals/mcom/1975-29-129/S0025-5718-1975-0373371-6/S0025-5718-1975-0373371-6.pdf