【问题标题】:Order of Complexity of customized tree [closed]定制树的复杂性顺序[关闭]
【发布时间】:2015-11-29 08:54:33
【问题描述】:

请告诉我下面这棵树的复杂性。 请说明计算过程。

树形结构:

root->left->right 和 root->right->left 指向同一个节点。

算法:如果我们用正常的中序遍历来遍历树,那么我们将访问一些节点超过1次。

喜欢

node4(2次) 0->1->4 和 0->2->4

node7(3次) 0->1->3->7, 0->1->4->7, 0->2->4->7

上述算法的复杂度是多少?

【问题讨论】:

  • 嗯,存储复杂度是O(N)……但是如果你想知道这个数据结构上的算法的复杂度,你必须描述一下算法。
  • 这在实践中基本没用,作为搜索树。如果您有任何特定用途,则必须指定它才能获得答案。
  • @Rob: 算法更新有问题
  • @yzt:在采访中提出了问题。所以这个数据结构的用途无所谓,只要知道复杂度就行了。

标签: c algorithm data-structures generic-programming


【解决方案1】:

在您的图解结构(这是一个有向无环图或“DAG”,而不是树)中,遍历将访问除叶节点之外的每个节点的两个子节点。因此它将访问总共 2h-1 个节点(计算重复),其中 h 是 DAG 的高度。 (图中高度为 5。)

假设 DAG 已完全填充,则 n(DAG 中的节点数)必须为 h(h+1)/2。 (这是从 1 到 h 的整数求和的高斯公式。)

Solving n = h(h+1)/2 for h gives us h = (sqrt(8n + 1) - 1)/2,所以访问的节点总数,以 n 计,为 2(sqrt(8n + 1) - 1)/2 - 1。

更新

遍历函数如下所示:

def traverse(node):
    if node.left is not None:
        traverse(node.left)
    print(node.data)
    if node.right is not None:
        traverse(node.right)

请注意,traverse 不会查看节点的父节点,而只会查看其子节点。从traverse 的角度来看,某些节点是共享的(因此有两个父节点)是无关紧要的。它无法区分你的 DAG 和普通二叉树。

DAG 的每个内部节点都恰好有两个子节点。因此,从traverse 的角度来看,您的 DAG 与高度为 h 的完全填充的二叉树相同。高度为 h 的完全填充的二叉树有 2h-1 个节点。

【讨论】:

  • 由于这不是正常的二叉树,你怎么说节点被访问 pow(2,h)-1 次。
  • 我已经更新了我的答案。
【解决方案2】:

如果我们明智地检查关卡遍历了多少次,那么我们将达到以下输出

1 级 - 1 次

2级-2次

3-4次

4-8次

5 级 - 14 次

到

h级

总遍历为:1 + 2 + 4 + 8 + 14 + ... 直到 h 级

将系列分成 2 个系列:

(1+0) + (2+0) + (3+1) + (4+4) + (5+9) + ... h+sqOf(h-2)

意思

1+2+3+4+ ... +h

+

sqOf(1) + sqOf(2) + sqOf(3) + ... +sqOf(h-2)

=>h(h+1)/2 + (h-2)(h-1)(2h-3)/6

所以复杂度的顺序变成了 cubeOf(h),其中 h 是 (sqrt(8n + 1) - 1)/2(正如 rob mayoff 解释的那样)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    • 2017-11-20
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 2011-10-26
    相关资源
    最近更新 更多