【问题标题】:Finding time complexity with trees and recursion使用树和递归查找时间复杂度
【发布时间】:2011-10-27 05:34:02
【问题描述】:

我认为这是 O(n) 是否正确?我真的不擅长递归。有人可以确认一下,或者向我解释一下吗?

Counter(a)
    if hasLeft(a)
        return Counter(left(a) + Counter (right(a))
    else
        return 1

基本上,如果树中没有左节点,则返回0。如果有左音符,则返回1。

谢谢!

【问题讨论】:

  • 如果您的意图是真正基于没有左节点/左节点返回 0 或 1,您可以非常轻松地制作 O(1) 例程,无需递归。除此之外,还不清楚您要完成什么,但感觉您的代码示例有缺陷(如果!hasLeft(a) .... recurse based on left(a)... 当您已经确定没有左分支。
  • 对不起 - 我修好了。我不是故意的!我只是想在这里使用这个特定的代码来理解递归和时间复杂度。

标签: algorithm recursion


【解决方案1】:

如果是(二叉)树,因为图中没有循环,所以最多只检查每个节点一次,所以它是O(n)

【讨论】:

  • 我只是减少了算法,忘记删除h。我会编辑它。我以为是 O(n) - 感谢您的确认 + 解释!
  • @Kris,如果这是您的答案,请将答案左侧的复选框切换为绿色。
【解决方案2】:

您的代码不符合宣传的要求。你说如果有左节点,你希望它返回 1,如果没有左节点,则返回 0。但是你的代码是:

Counter(a)
    if hasLeft(a)
        return Counter(left(a)) + Counter(right(a))
    else
        return 1

如果根节点没有左节点,则返回 1,但它不检查树的其余部分。此代码不会检查整个树,而是会在没有左节点的第一层停止。

你真正想做什么?

【讨论】:

  • 他的问题是关于运行时间而不是代码是否正确。这个答案可以是评论。空值检查,...是另一个注释。
  • @Saeed:我明白这一点,但很难为不起作用的代码提供运行时间。
  • 你可以假设这是一个伪代码,它可以在没有你的建议的情况下工作(但他应该添加空检查),但它可能无法按他的意愿工作,但它是一种算法并且有运行时间。
猜你喜欢
  • 2014-04-02
  • 2022-06-22
  • 1970-01-01
  • 2018-07-23
  • 2021-03-10
  • 2021-06-27
  • 2019-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多