我想估计一个大树结构中的叶子数量,我无法详尽地访问每个节点。这个算法合适吗?它有名字吗?另外,如果我不正确地使用任何条款,请迂腐。
sum_trials = 0
num_trials = 0
WHILE time_is_not_up
bits = 0
ptr = tree.root
WHILE count(ptr.children) > 0
bits += log2(count(ptr.children))
ptr = ptr.children[rand()%count(ptr.children)]
sum_trials += bits
num_trials++
estimated_tree_size = 2^(sum_trials/num_trials)
答案 0 :(得分:3)
如果您可以对树进行一些安全的假设(例如:它是否平衡?)及其用法(有关多少叶子将成为同一节点的子节点的安全假设?),这可能是可能的。更好的是,如果每次添加/删除叶节点时都保持运行计数(计数器)。然后,您只需在一次操作中访问计数器变量。
答案 1 :(得分:2)
估算树木大小的理论,是指数时间分析的基础
中的算法和某些启发式方法可满足性手册,IOS Press 2009,ISBN 978-1-58603-929-5 (编辑Armin Biere,Marijn J.H. Heule,Hans van Maaren和Toby Walsh) http://www.iospress.nl/book/handbook-of-satisfiability/
即第7章“分支启发式基础”(第205-244页)。 基础技术报告是 http://www.swan.ac.uk/compsci/research/reports/2008/CSR7-2008.pdf 该章可在以下网站获取 http://www.booksonline.iospress.nl/Content/View.aspx?piid=11712
这个理论在Donald Knuth的上述论文中概括了这种方法(1975, 估计回溯计划的效率)。