如何在 SML 中找到树的最小值和最大值

欧巴

我有两种数据类型:

datatype 'a Tree = LEAF of 'a | NODE of ('a Tree) * ('a Tree)

datatype 'a myTree = myLEAF of 'a | myNODE of 'a * 'a * 'a myTree * 'a myTree

有了这两个,我需要能够找到树的最小值和最大值。

例如:

findMin (NODE(NODE(LEAF(5),NODE(LEAF(6),LEAF(8))),LEAF(4)))

将产生 4。

我已经在这方面工作了一段时间,我很困惑。

任何指导都会有所帮助。谢谢你。

西蒙·希恩

您知道每个'a Tree中至少有一个元素,因此总有一个最小值/最大值。

在两个构造函数LEAFand 中的每一个上使用模式匹配NODE,并在这种NODE情况下使用递归,因为两个分支可能具有不同的最小值/最大值,并且节点的最小值/最大值由其分支的最小值/最大值决定。并使用内置的辅助函数Int.minand Int.max,如果您要查找的最小/最大整数(您的示例表明情况确实如此。)

fun findMin (LEAF x) = (* ... *)
  | findMin (NODE (leftTree, rightTree)) =
    let (* ... use findMin recursively on each branch ... *)
    in (* ... find the minimal value of the two branches ... *)
    end

我不确定'a myTree类型有什么用:它是一个二叉树,因为它每个节点有两个'a myTree分支,但每个节点也有两个'a元素?您是否有兴趣找到这些值中任何一个的最小值/最大值或者在某些基于树的字典结构中,一个是键,另一个是值?如果是这样,那么为什么是'a -> 'a而不是'a -> 'b当您不理解问题陈述时,很难解决问题,而数据类型是其中的很大一部分。

编辑:由于您自己提供了解决方案,让我对此提供一些反馈:

fun findMin (LEAF(v)) = v
  | findMin (NODE(left, right)) =
      if findMin(left) < findMin(right)
      then findMin(left)
      else findMin(right)

该解决方案非常低效,因为它为每个节点的整个子树调用了 3 次。这意味着函数调用的数量大致遵循递推关系 f(0) = 1f(n) = 3 ⋅ f(n-1)这相当于3 ñ或指数多次呼吁找到列表的最小元素ñ元素。

  • 这是一种通过临时存储两次使用的结果来花费线性时间的方法:

    fun findMin (LEAF v) = v
      | findMin (NODE (left, right)) =
        let val minLeft = findMin left
            val minRight = findMin right
        in if minLeft < minRight then minLeft else minRight
        end
    

    没有理由在树的每个节点中执行计算findMin leftfindMin right多次的艰巨任务因为我们多次引用它,所以let-in-end是一种结果绑定到词法范围名称的简单方法minLeft并且minRight.

  • 该表达式if minLeft < minRight then minLeft else minRight实际上在标准库中有一个名称:Int.min. 所以我们可以这样做:

    fun findMin (LEAF v) = v
      | findMin (NODE (left, right)) =
        let val minLeft = findMin left
            val minRight = findMin right
        in Int.min (minLeft, minRight)
        end
    
  • 但是使用let-in-end的原因实际上已经消失了,因为在库函数的帮助下,我们现在只提到findMin left(aka minLeft) 和findMin right(aka minRight)一次(实际上,我们不止一次提到它们,但Int.min在里面,结果被绑定到一个临时的、词法范围的名称。)

    所以我们放弃让终端更短的时间:

    fun findMin (LEAF v) = v
      | findMin (NODE (left, right)) = Int.min (findMin left, findMin right)
    

    在任何情况下,这些都是同样优化的:它们只对树中的n 个元素使用n 个递归函数调用,这是元素未排序时最少可以执行的操作。现在,如果你知道较小的元素总是在左边,你就会有一个二叉搜索树,你可以更快地找到最小值/最大值。:-)

编辑(再次):只是为了好玩,您可以同时找到最小值/最大值:

fun findMinMax (LEAF v) = (v, v)
  | findMinMax (NODE (left, right)) =
    let val (minLeft, maxLeft) = findMinMax left
        val (minRight, maxRight) = findMinMax right
    in (Int.min (minLeft, minRight), Int.max(maxLeft, maxRight))
    end

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在列表中找到所有局部最大值和最小值

来自分类Dev

如何在r的数据框中找到数字wrt的最大值和最小值?

来自分类Dev

如何在while循环中找到最大值和最小值 - c

来自分类Dev

如何在python中找到掷骰子程序的最小值和最大值

来自分类Dev

如何在十进制列表中找到最小值和最大值?

来自分类Dev

如何从掷骰子中找到最小值和最大值?

来自分类Dev

如何在numpy中的3d数组中找到最小值和最大值,并将结果分组?

来自分类Dev

如何在不使用if语句的情况下在数组中找到最大值和最小值?

来自分类Dev

如何在数组以及对应的日期中找到最大值和最小值

来自分类Dev

如何在Python列表中找到最小值或最大值

来自分类Dev

如何通过has_many关系从最大值中找到最小值

来自分类Dev

MySQL如何在求和一列后找到最大值和最小值

来自分类Dev

如何在pd.DataFrame的另一列中找到满足条件的行之间的最大值和最小值?

来自分类Dev

如何在数据框中的变量中找到一组中最大值和最小值的差异

来自分类Dev

如何使用 python pandas 找到 ID 1 和 5 的最小值和最大值?

来自分类Dev

如何找到小于或等于X的最大值和大于或等于X的最小值?

来自分类Dev

如何在R的一列中的值序列内找到最大值和最小值?

来自分类Dev

gnuplot:如何绘制最大值和/或最小值

来自分类Dev

如何从Json获取最小值和最大值

来自分类Dev

如何打印最大值和最小值?

来自分类Dev

如何从 R 中跨多个数据帧的公共列中找到最大值/最小值

来自分类常见问题

Postgres如何在最小值列和最大值列之间返回值

来自分类Dev

Postgres如何在最小值列和最大值列之间返回值

来自分类Dev

如何在接受浮点值的输入类型上设置最小值和最大值?

来自分类Dev

如何在SQL Server中计算序列中组的最小值和最大值?

来自分类Dev

如何在Android的RangeSeekBar中获取当前的最小值和最大值?

来自分类Dev

如何在Mips中打印数组的最大值和最小值

来自分类Dev

如何在Google Visualization Gauge中删除最小值和最大值

来自分类Dev

如何在轴的末端显示最小值和最大值

Related 相关文章

  1. 1

    如何在列表中找到所有局部最大值和最小值

  2. 2

    如何在r的数据框中找到数字wrt的最大值和最小值?

  3. 3

    如何在while循环中找到最大值和最小值 - c

  4. 4

    如何在python中找到掷骰子程序的最小值和最大值

  5. 5

    如何在十进制列表中找到最小值和最大值?

  6. 6

    如何从掷骰子中找到最小值和最大值?

  7. 7

    如何在numpy中的3d数组中找到最小值和最大值,并将结果分组?

  8. 8

    如何在不使用if语句的情况下在数组中找到最大值和最小值?

  9. 9

    如何在数组以及对应的日期中找到最大值和最小值

  10. 10

    如何在Python列表中找到最小值或最大值

  11. 11

    如何通过has_many关系从最大值中找到最小值

  12. 12

    MySQL如何在求和一列后找到最大值和最小值

  13. 13

    如何在pd.DataFrame的另一列中找到满足条件的行之间的最大值和最小值?

  14. 14

    如何在数据框中的变量中找到一组中最大值和最小值的差异

  15. 15

    如何使用 python pandas 找到 ID 1 和 5 的最小值和最大值?

  16. 16

    如何找到小于或等于X的最大值和大于或等于X的最小值?

  17. 17

    如何在R的一列中的值序列内找到最大值和最小值?

  18. 18

    gnuplot:如何绘制最大值和/或最小值

  19. 19

    如何从Json获取最小值和最大值

  20. 20

    如何打印最大值和最小值?

  21. 21

    如何从 R 中跨多个数据帧的公共列中找到最大值/最小值

  22. 22

    Postgres如何在最小值列和最大值列之间返回值

  23. 23

    Postgres如何在最小值列和最大值列之间返回值

  24. 24

    如何在接受浮点值的输入类型上设置最小值和最大值?

  25. 25

    如何在SQL Server中计算序列中组的最小值和最大值?

  26. 26

    如何在Android的RangeSeekBar中获取当前的最小值和最大值?

  27. 27

    如何在Mips中打印数组的最大值和最小值

  28. 28

    如何在Google Visualization Gauge中删除最小值和最大值

  29. 29

    如何在轴的末端显示最小值和最大值

热门标签

归档