【问题标题】:How to avoid copying / creating new node when inserting into a BST插入 BST 时如何避免复制/创建新节点
【发布时间】: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 插入二叉搜索树 复制整个搜索路径,即使复制的节点是 和原版没有区别。使用异常重写插入 以避免这种复制。每次插入只建立一个处理程序,而不是 每次迭代不止一个处理程序。

我实际上完全不遵循这个练习。

  1. “使用异常来避免这种复制”是什么意思?
  2. 为什么要使用“例外”?
  3. 什么是“每次插入一个处理程序”?

【问题讨论】:

  • 哦,伙计,我也花了很多时间试图弄清楚这一点。完全错过了 existing 元素位。

标签: functional-programming ocaml binary-search-tree sml


【解决方案1】:

请注意,只有在插入已经存在的元素时才能避免复制!了解如何做到这一点应该不会太难。

【讨论】:

  • 啊,好吧,我以为完全可以避免
  • 等等,你确定吗?我应该在真正插入之前做一个mem 测试吗?
  • 如果您阅读复制的文本,它会显示“将 现有 元素插入二叉搜索树......”(强调我的)。当然,您可以进行内存测试。只是一个小的持续放缓。你可以从搜索的底部抛出异常,传回额外的状态,等等。
  • 我盯着这个问题看了一个多小时,然后在堆栈溢出上看到“存在”这个词:/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-14
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
  • 2012-07-15
  • 1970-01-01
  • 2020-04-01
相关资源
最近更新 更多