c# – 为什么在Finger Trees和Linked Lists等中使用元组
关于手指树,如
this paper所示,并由Eric Lippert在
this post中提到.
我不明白为什么使用显式元组排列,而不是每个手指的某种链表结构.也就是说,为什么我们定义One(x),Two(x,y),Three(x,y,z),Four(x,z,a)并且不仅仅具有不太理想的deque对象并且做LessOptimalDeque .AddLeft(x)的? 它有点慢吗?我的意思是,即使您可以使用一些重用某些节点/节点组的内存的数据结构? 在论文中,甚至提到:
data Digit a = One a | Two a a | Three a a a | Four a a a a
我不知道为什么它更有效率.它只是与作者使用的函数语言相关的东西,还可以使用我上面提出的数据结构来完成吗? 编辑 怎么样这样实施手指? 解决方法
要了解为什么这在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)中的大小. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |