加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 为什么在Finger Trees和Linked Lists等中使用元组

发布时间:2020-12-15 17:27:20 所属栏目:百科 来源:网络整理
导读:关于手指树,如 this paper所示,并由Eric Lippert在 this post中提到. 我不明白为什么使用显式元组排列,而不是每个手指的某种链表结构.也就是说,为什么我们定义One(x),Two(x,y),Three(x,y,z),Four(x,z,a)并且不仅仅具有不太理想的deque对象并且做LessOptimalD
关于手指树,如 this paper所示,并由Eric Lippert在 this post中提到.

我不明白为什么使用显式元组排列,而不是每个手指的某种链表结构.也就是说,为什么我们定义One(x),Two(x,y),Three(x,y,z),Four(x,z,a)并且不仅仅具有不太理想的deque对象并且做LessOptimalDeque .AddLeft(x)的?

它有点慢吗?我的意思是,即使您可以使用一些重用某些节点/节点组的内存的数据结构?

在论文中,甚至提到:

Exercise 1. In the above presentation,we represented digits as lists for simplicity.
A more accurate and efficient implementation would use the type

data Digit a = One a  
| Two a a
| Three a a a
| Four a a a a

Rework the above denitions to use this denition of Digit.

我不知道为什么它更有效率.它只是与作者使用的函数语言相关的东西,还可以使用我上面提出的数据结构来完成吗?

编辑

怎么样这样实施手指?

解决方法

要了解为什么这在Haskell中更有效:

data Digit a
           = One a  
           | Two a a
           | Three a a a
           | Four a a a a

比这(矢量的明显编码):

data List a = One a
            | Many a (List a) -- a linked list of at least one element.

我们可以观察分配数字与列表所需的堆结构.

Four 'x' 'y' 'z' 'd'

VS

Many 'x' (Many 'y' (Many 'z' (One 'd')))

在前一种情况下,我们保存了3个构造函数.在后者中,我们被迫为结构的(可能是无限的)尾部分配额外的堆对象.通常,Digit表示将分配O(n-1)个较少的堆单元,因为结构的大小在最外层的构造函数中编码.我们还可以确定O(1)中的大小.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读