【发布时间】:2013-11-07 13:54:07
【问题描述】:
让我们暂时忽略 BST 的平衡部分。
type 'a bst =
| Leaf
| Node of 'a bst * 'a * 'a bst
典型的insert 如下所示:
let rec insert x = function
| Leaf -> Node (Leaf, x, Leaf)
| Node (l, k, r) as n ->
if x = k then n
else if x < k then Node (insert x l, k, r)
else Node (l, k, insert x r)
毫无疑问,函数insert 将沿着搜索路径create new nodes / make a copy of nodes。
所以我的问题是有没有办法避免这种复制?
本题来自Exercise 2.3本书Purely Functional Data Structures:
练习 2.3 将现有的 eleemtn 插入二叉搜索树 复制整个搜索路径,即使复制的节点是 和原版没有区别。使用异常重写插入 以避免这种复制。每次插入只建立一个处理程序,而不是 每次迭代不止一个处理程序。
我实际上完全不遵循这个练习。
- “使用异常来避免这种复制”是什么意思?
- 为什么要使用“例外”?
- 什么是“每次插入一个处理程序”?
【问题讨论】:
-
哦,伙计,我也花了很多时间试图弄清楚这一点。完全错过了 existing 元素位。
标签: functional-programming ocaml binary-search-tree sml