【问题标题】:How do I create a functional array represented by a binary tree with standard ML?如何使用标准 ML 创建由二叉树表示的函数数组?
【发布时间】:2018-04-09 09:41:00
【问题描述】:

我正在尝试使用列表创建一个函数数组,其中包含来自问题的给定函数。 正式的任务是从索引从 1 开始的列表创建一个函数数组。

但是,我在这个任务中卡住了好几天,没有任何进展。希望得到一些提示来完成这项工作..

这是我所做的:

datatype 'a tree = Leaf 
                 | Branch of 'a * 'a tree * 'a tree

fun addnode a Leaf = Branch (a, Leaf, Leaf)
      | addnode a (Branch (b, tree1, tree2)) = Branch (a, addnode b tree2, tree1);

fun functionalarray (0, a) = Leaf
    | functionalarray(n, a::b::r) = Branch(a, functionalarray(n div 2, r), functionalarray(n-1 div 2, b::r));

其中addnode 是问题中的给定函数。但我想不出一种方法来使用这个功能。另外,我不知道为什么我的解决方案不起作用....

我想如果我必须使用给定的函数,我需要执行 n mod 2 这样如果 n 是偶数,那么我需要递归调用 functionalarray 在左侧创建一个新分支,如果 @ 987654326@ 和 n 是奇数,然后我在右侧创建一个新分支。但是,如果我这样做,那么我不知道在分支的左侧或右侧放置什么。例如,我可以调用类似

if n mod 2 = 0 then Branch(a, functionalarray(n div 2, r), ...

但我不会使用 addnode 并且我不知道应该在分支的右侧放置什么。

任何帮助都非常非常感谢......

【问题讨论】:

  • addnode 的定义对我来说似乎很奇怪。您多次提到“问题”;我认为这是一个家庭作业问题?可以发完整篇吗?
  • 问题描述其实很短,我用粗体写的。我还添加了二叉树的定义以澄清addnode的存在。
  • 我不明白。您说“addnode 是问题中的给定函数”;但问题描述并没有说明什么。我错过了什么?
  • 问题没有指定您必须使用该功能,但它说使用此功能有一个优雅的解决方案。我做了进一步的研究,发现这实际上是一个布劳恩树结构,它显然具有 O(n) 时间复杂度的“优雅解决方案”,但我无法理解伪代码,因为 ML 使用链表(对于记录,我真的不明白foldr等是什么):eecs.northwestern.edu/~robby/courses/395-495-2013-fall/…
  • 回复:“[问题] 说使用此功能有一个优雅的解决方案”:嗯?您说整个问题描述是“正式地,任务是从索引从 1 开始的列表中创建一个函数数组。”其中哪一部分说明了此功能或优雅的解决方案?

标签: arrays recursion functional-programming binary-tree sml


【解决方案1】:

addnode 函数在树的最左边插入一个新元素,即作为它所代表的数组的第一个元素。通过这样做,所有现有元素在结果数组中有效地向上移动一个索引。因此,您需要做的就是从右到左遍历输入列表并为每个元素应用addnode,从一个空数组开始。提示:这是一个带有List.foldr 的单行代码。

当然,这个问题很奇怪,因为这种方法不可避免地会创建一个尽可能不平衡的退化树,因此并不比使用普通列表表示数组更有效。

【讨论】:

  • 我认为你忽略了addnode 交换了两个子树的顺序。 (这真的很奇怪;我无法理解。)
  • 我认为标准是创建一个函数数组,这可能是一个平衡树?我在这里找到了相关资源:eecs.northwestern.edu/~robby/courses/395-495-2013-fall/… 但不幸的是我无法理解它在说什么(许多奇怪的语法)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-20
  • 1970-01-01
  • 2015-10-19
  • 2016-09-03
  • 1970-01-01
  • 2021-02-27
  • 2012-01-05
相关资源
最近更新 更多