记忆后方法较慢

时间:2017-01-18 02:27:13

标签: ruby algorithm recursion time-complexity memoization

我正在研究Leetcode上的以下算法问题:

  

给定二叉树,确定它是否是高度平衡的。为了这   问题,高度平衡的二叉树被定义为二进制树   其中每个节点的两个子树的深度从不相差更多   比1。

以下是链接:https://leetcode.com/problems/balanced-binary-tree/

我写了两个解决方案 - 两个都通过了Leetcode的测试。第一个应该比第二个更昂贵,因为它反复扫描每个子树的节点以计算每个节点的高度。第二个解决方案应该将所有节点高度收集到缓存中,以便不必重复计算。然而,事实证明我的第二个解决方案实际上比我的第一个解决方案慢,我不知道为什么。有什么输入吗?

解决方案1:

def is_balanced(root) #runs at 139 ms
  return true if root.nil? 
  left_height = height(root.left)
  right_height = height(root.right)

  if !equal?(left_height, right_height)
    return false 
  else 
    is_balanced(root.left) && is_balanced(root.right)
  end 
end 

def height(node)
  return 0 if node.nil?
  [height(node.left), height(node.right)].max + 1 
end

def equal?(num1, num2)
  return true  if (num1-num2).abs <= 1
  false    
end

解决方案2 :(编辑以包括cobaltsoda的建议)

@memo = {}
def is_balanced(root)
  @memo = {}
  return true if root.nil? 
  left_height = height(root.left)
  right_height = height(root.right)

  if !equal?(left_height, right_height)
    return false 
  else 
    is_balanced(root.left) && is_balanced(root.right)
  end 
end 

def height(node)
  @memo[node] = 0 if node.nil?
  @memo[node] ||= [height(node.left), height(node.right)].max + 1 
end

def equal?(num1, num2)
  return true  if (num1-num2).abs <= 1
  false    
end

因为第二个解决方案使用了memoization,它不应该削减冗余并降低程序的时间开销吗?不确定我错过了什么。

另外,通过memoization,这从O(NlogN)算法到O(N)正确吗?

0 个答案:

没有答案