Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 边遍历代价较高的树中总节点的统计估计_Python_Algorithm_Tree_Statistics_Duplicates - Fatal编程技术网

Python 边遍历代价较高的树中总节点的统计估计

Python 边遍历代价较高的树中总节点的统计估计,python,algorithm,tree,statistics,duplicates,Python,Algorithm,Tree,Statistics,Duplicates,我有一个定向树,我想知道它的大小。我没有关于其深度或节点分布的信息。有两大障碍: 1) 该树非常大(约数十亿个节点) 2) 边遍历是昂贵的 是否有统计方法可用于快速且误差有界地估计其大小(节点数)?不幸的是,谷歌搜索只会产生精确的计数算法,在这些限制条件下,这些算法的性能会很差 奖金 如果我将约束从树放松到DAG(有向无环图),我可以得到它的大小和唯一路径的数量吗?例如,对于此DAG(每条边都指向下方) 共有19个节点(大小)和23条路径(4条额外路径,因为红色边为其目标节点提供了1条路径,为

我有一个定向树,我想知道它的大小。我没有关于其深度或节点分布的信息。有两大障碍:

1) 该树非常大(约数十亿个节点)

2) 边遍历是昂贵的

是否有统计方法可用于快速且误差有界地估计其大小(节点数)?不幸的是,谷歌搜索只会产生精确的计数算法,在这些限制条件下,这些算法的性能会很差

奖金

如果我将约束从树放松到DAG(有向无环图),我可以得到它的大小和唯一路径的数量吗?例如,对于此DAG(每条边都指向下方)

共有19个节点(大小)和23条路径(4条额外路径,因为红色边为其目标节点提供了1条路径,为其目标节点的子节点提供了3条路径)

我尝试过的事情

对于tree案例,我想到了以下几点:

amounts = []
def estimateHelper(node):
    amounts[node.depth].push(len(node.children))
    for each child in small random sample of node.children:
        estimateHelper(child)
def estimate(root):
    estimateHelper(root)
    reach = 0
    for (j = len(amounts) - 1; j >= 0; --j):
        avgChildrenPerNodeAtThisLevel = avg(amounts[j])
        reach = avgChildrenPerNodeAtThisLevel + avgChildrenPerNodeAtThisLevel * reach
    return reach
它本质上计算树最深节点的“到达”,然后将其传播回上面的级别,以找到该级别的到达。它会这样做,直到最终找到树根的“触角”。我不确定我是否对上述算法中的节点均匀分布做了任何假设。重申一下,我不知道给定的树会有什么样的分布

假设它工作,这也解决了DAG的“路径”。一旦你有了所有的“路径”,我想用生日悖论的倒数来计算有多少独特的节点。生日悖论回答“如果一年中有365天是唯一的,那么我们需要选择多少天(路径),直到我们以某种概率到达重复的一天”。因此,我们不断尝试随机路径(天数),直到我们碰到一个重复节点,我们重复几次,以找到该事件的概率,然后我们将其插入生日悖论中,以找到唯一节点的数量(一年中唯一的天数)。不过请注意,生日悖论也提出了一致性假设


这些都不是很严格。理想的情况是给我一个有误差界的估计,以及一篇足够严谨地描述算法的论文。非常感谢任何指向正确方向的指针。

Knuth在回溯树搜索的背景下就此写了一篇论文:评估回溯程序的效率-例如。搜索词Knuth-tree-estimate也可以找到引用该词的文章,如和

我不知道一般情况下这将如何转化为DAG,但是——同样在树搜索的上下文中——您可以通过添加不允许边在第一次进入每个顶点后进入每个顶点的约束,将DAG重新定义为具有相同顶点数目的树。例如,当一个接一个地选择数字子集时,要求按升序列出它们-然后(1,3,8)只有一个祖先(1,3)


仔细想想,您还可以定义一棵树,其中每个DAG路径到一条边定义了树中的不同边。计算此中的边数可能会告诉您有关DAG路径数的信息。

获取其大小是什么意思?计算节点数?给定节点的子节点数量是否有限制?例如,您可以退一步尝试另一种方法:这棵树是如何构建的?也许您可以存储一个计数器,每次插入时递增,每次移除时递减?也许在构建过程中存储其他信息是您需要的?嗨,Filipe。大小是节点数。一个节点有多少子节点并没有实际的限制,但实际的限制是大约100000个。树不是由我构建的,而是由大量分布式服务器构建的。我想在本地(在我的笔记本电脑上)快速估计大小,而边缘遍历是昂贵的,因为对于每个节点,我都需要向相应的服务器发出网络请求。尝试验证您的算法:运行100次并计算其相对分散度。还可以尝试不同的平均值(二次平均值、几何平均值等),并调整样本大小。@SergiuToarca您无法遍历节点,也无法从服务器获取有关树的任何其他信息,但您有每个节点的平均子节点数(平均值)。这是一个糟糕的情况)如果你能得到以KB或MB为单位的树的总大小(total)-用除法total/(NODESZ+AVG*CHILDSZ)计算节点数。它将是估计的上界(如果AVG是确定的)。我不认为你可以有界误差,除非你看每一条可能的路径。如果您没有查看的路径的节点数是整个树其余部分的十倍,该怎么办?谢谢,这看起来正是我想要的树案例!我会坚持给出答案,以防有人能找到DAG案例的解决方案(我也在查阅所有的参考资料)。谢谢-我确实考虑过定义与给定DAG具有相同顶点数的树,这在某些情况下可能会起作用,我将其添加为编辑。