Ruby Heapify 实施/优化
Ruby Heapify Implementation / Optimization
我正在 Ruby 中实现 Heapify 算法(即将二叉树转换为堆),并认为下面的方法可行。我担心的是我进行了过多的递归调用。
第一次和第二次递归调用是从左右子树中选择最高节点,第三次递归调用是在我交换节点时做同样的事情。没有包括我的 swap_parent_child 方法,有点长但它有效。
def max_heapify(node)
return nil if node.nil?
return node if node.left.nil? && node.right.nil?
left = max_heapify(node.left)
right = max_heapify(node.right)
max_value = find_max_value(node, left, right)
if node.value == max_value
node
elsif left && left.value == max_value
swap_parent_child(node, left)
max_heapify(node)
left
else
swap_parent_child(node, right)
max_heapify(node)
right
end
end
def find_max_value(node, node2, node3)
max_value = node.value
max_value = node2.value if node2 && node2.value > max_value
max_value = node3.value if node3 && node3.value > max_value
max_value
end
我已经检查了此处列出的算法,但不确定它是否有效。 https://www.cs.rit.edu/~rpj/courses/bic2/studios/studio1/studio121.html#M502
似乎根据该站点的算法会执行以下操作并停止。
5 5
|\ | \
2 4 => 10 4
| |
10 2
我在这里错过了什么?或者堆化一棵树真的需要每个方法调用三个递归调用吗?
对于将来遇到此问题的任何人,正确的方法是堆化表示树的数组,而不是具有父指针和左右指针的实际二叉树。
维基百科上的这个部分对我很有帮助:https://en.wikipedia.org/wiki/Binary_heap#Heap_implementation
我正在 Ruby 中实现 Heapify 算法(即将二叉树转换为堆),并认为下面的方法可行。我担心的是我进行了过多的递归调用。
第一次和第二次递归调用是从左右子树中选择最高节点,第三次递归调用是在我交换节点时做同样的事情。没有包括我的 swap_parent_child 方法,有点长但它有效。
def max_heapify(node)
return nil if node.nil?
return node if node.left.nil? && node.right.nil?
left = max_heapify(node.left)
right = max_heapify(node.right)
max_value = find_max_value(node, left, right)
if node.value == max_value
node
elsif left && left.value == max_value
swap_parent_child(node, left)
max_heapify(node)
left
else
swap_parent_child(node, right)
max_heapify(node)
right
end
end
def find_max_value(node, node2, node3)
max_value = node.value
max_value = node2.value if node2 && node2.value > max_value
max_value = node3.value if node3 && node3.value > max_value
max_value
end
我已经检查了此处列出的算法,但不确定它是否有效。 https://www.cs.rit.edu/~rpj/courses/bic2/studios/studio1/studio121.html#M502
似乎根据该站点的算法会执行以下操作并停止。
5 5
|\ | \
2 4 => 10 4
| |
10 2
我在这里错过了什么?或者堆化一棵树真的需要每个方法调用三个递归调用吗?
对于将来遇到此问题的任何人,正确的方法是堆化表示树的数组,而不是具有父指针和左右指针的实际二叉树。
维基百科上的这个部分对我很有帮助:https://en.wikipedia.org/wiki/Binary_heap#Heap_implementation