【发布时间】:2010-05-18 23:14:45
【问题描述】:
对于我的算法和数据结构课程,我的任务是在 Haskell 中实现一个展开树。我的splay操作算法如下:
- 如果要展开的节点是根,则返回未更改的树。
- 如果要展开的节点距根节点一层,则执行 zig 操作并返回结果树。
- 如果要展开的节点距根节点有两层或更多层,则对从该节点开始展开子树的结果执行 zig-zig 或 zig-zag 操作,并返回结果树。李>
我的老师说这是有效的。然而,the Wikipedia description of a splay tree 表示 zig 步骤“将仅作为展开操作的最后一步完成”,而在我的算法中,它是展开操作的第一步。
我想实现一个展开树,它最后而不是第一个执行 zig 操作,但我不确定如何最好地完成。在我看来,这样的算法会变得更加复杂,因为需要先找到要展开的节点,然后才能确定是否应该执行 zig 操作。
如何在 Haskell(或其他一些函数式语言)中实现这一点?
示例
在此示例中,我们搜索值 4,提示我们将其展开到树的顶部。
我的算法(zig 作为第一步)
1 1 4 \ \ / 2 之字形 2 之字形 2 \ --> \ ------> / \ 3 4 1 3 \ / 4 3维基百科算法(zig 作为最后一步)
1 1 4 \ \ / 2 之字形 4 之字形 1 \ ------> / --> \ 3 3 3 \ / / 4 2 2两棵树都是有效的,但它们的结构不同。我想用函数式语言实现第二个,最好是 Haskell。
【问题讨论】:
-
这在技术上是家庭作业,但是由于算法已经被接受并且我已经提交了作业,所以我只是出于好奇而问。这就是为什么我没有将这个问题标记为作业。
-
这里有一个很好的 Haskell Splay Trees 实现 haskell.org/pipermail/haskell-cafe/2010-October/085377.html
标签: haskell functional-programming splay-tree