问题 Julia中推荐的数据结构,用于高效追加


Julia中理想的类似列表的数据结构是什么?

我想要一个具有常量时间追加操作的可索引,可增长的集合。

标准数据结构似乎是 Array 随着 push! 操作。这是不变的时间吗?


12724
2018-01-10 19:34


起源



答案:


正如哈兰所说, push! 是摊销的常数时间。有关参数的原因,请参阅C ++类似数据结构的描述: std :: vector插入的摊销分析

如果您想要一个合法的恒定时间数据结构,您可能希望实现一个链表。我已经看过很多样本实现,但没有任何可用于生产的东西。


8
2018-01-11 16:27



摊销的恒定时间对我来说很好!大多数时候我很好奇。 - MRocklin


答案:


正如哈兰所说, push! 是摊销的常数时间。有关参数的原因,请参阅C ++类似数据结构的描述: std :: vector插入的摊销分析

如果您想要一个合法的恒定时间数据结构,您可能希望实现一个链表。我已经看过很多样本实现,但没有任何可用于生产的东西。


8
2018-01-11 16:27



摊销的恒定时间对我来说很好!大多数时候我很好奇。 - MRocklin


反复呼唤 push! 不是恒定的时间,但它很快。它偶尔会对缓冲区进行指数式重新分配。请参阅附加到数组的C源: https://github.com/JuliaLang/julia/blob/master/src/array.c#L564 


3
2018-01-10 20:23





差异列表允许您在恒定时间内追加,前置和连接。我昨天推了一个实施 这里。它实际上只是几行代码,但我通过添加对迭代和显示的支持使其变得更加漂亮。

您可以使用。创建差异列表 dl 功能,像这样: dl(1, 2, 3) 或者为您可以迭代的任何内容制作差异列表 todl(items)

您可以使用常量时间连接任意数量的差异列表 concat 功能,像这样: concat(dl(1, 2), dl(3, 4))

您可以使用 pushfirst 和 push 在恒定时间内添加到开始和结束。

差异列表可以迭代,因此您可以在for循环和splats中使用它们,并轻松将它们转换为数组。

我正在等待它作为Julia包发布,但你可以使用 DifferenceLists.jl文件 直。


0
2017-09-03 08:48