dev*_*ium 35 .net f# functional-programming immutability data-structures
我不知道作为一个集合的东西如何是不可变的并且仍然具有可接受的性能.
从我在F#集中读到的内部使用红黑树作为它们的实现.如果每次我们想要为Red Black Tree添加新内容,我们必须基本上重新创建它,它如何才能获得良好的性能?我在这里错过了什么?
虽然我问F#的集合,但我认为这与任何其他拥有或使用不可变数据结构的语言相关.
谢谢
Nor*_*sey 38
几乎所有不可变的集合都是某种形式的平衡树.要创建新树,您必须在路径上重新分配从更改(插入,删除,"更新")到根的路径上的节点.只要树是平衡的,这需要对数时间.如果你有类似2-3-4树(类似于红黑树)的东西,预期的outdegree 3,你可以只使用10个分配来处理一百万个元素.
在数据结构预期纯粹的语言中,它们确保分配速度快.分配四元素节点将花费比较,增量和四个存储.在许多情况下,您可以通过多次分配来摊销比较的成本.
如果您想更多地了解这些结构是如何工作的,那么Chris Okasaki的纯功能数据结构就是一个很好的来源.
Tom*_*cek 13
正如其他人指出的那样,您不必重新创建整个数据结构.您只需重新创建已更改的零件并引用保持不变的现有子树.由于数据结构的不变性,您可以重用子树,因此几乎不需要复制所有内容.事实上,如果您需要很少克隆可变数据结构,它可能会产生更大的影响.
特别是对于平行树(例如红黑树),这会给你:
对于某些应用程序来说,这可能是 - 当然 - 开销太大,但实际上并不是那么糟糕.此外,.NET垃圾收集器中的分配非常快(我认为,基本上是O(1)),所以这不是一个真正的问题.更多的分配意味着GC需要更频繁地运行,但这也不像听起来那么重要 - 如今计算机拥有相当多的内存.在许多情况下,.NET 4.0实际上有所帮助(另请参阅Jon Harrop的答案)
| 归档时间: |
|
| 查看次数: |
3303 次 |
| 最近记录: |