【发布时间】:2014-01-10 19:34:40
【问题描述】:
Julia 中理想的类似列表的数据结构是什么?
我想要一个具有恒定时间追加操作的可索引、可增长的集合。
标准数据结构似乎是Array 与push! 操作。这是恒定的时间吗?
【问题讨论】:
标签: julia
Julia 中理想的类似列表的数据结构是什么?
我想要一个具有恒定时间追加操作的可索引、可增长的集合。
标准数据结构似乎是Array 与push! 操作。这是恒定的时间吗?
【问题讨论】:
标签: julia
正如 Harlan 所说,push! 是摊销常数时间。原因见 C++ 类似数据结构的描述:Amortized analysis of std::vector insertion
如果您想要一个合法的恒定时间数据结构,您可能想要实现一个链表。我已经看过很多示例实现,但没有一个可以投入生产。
【讨论】:
反复调用push! 不是固定时间,但速度非常快。它偶尔对缓冲区进行指数重新分配。附加到数组请参见 C 源代码:https://github.com/JuliaLang/julia/blob/master/src/array.c#L564
【讨论】:
差异列表可让您在恒定时间内追加、前置和连接。我昨天推送了一个实现here。它实际上只是几行代码,但我通过添加对迭代和显示的支持使它变得更漂亮。
您可以使用 dl 函数创建差异列表,如下所示:dl(1, 2, 3) 或为您可以使用 todl(items) 迭代的任何内容创建差异列表。
您可以使用concat 函数在恒定时间内连接任意数量的差异列表,如下所示:concat(dl(1, 2), dl(3, 4))。
您可以使用pushfirst 和push 以恒定时间添加到开始和结束。
差异列表可以迭代,因此您可以在 for 循环和 splats 中使用它们并轻松将它们转换为数组。
我正在等待它作为 Julia 包发布,但您可以直接使用 the DifferenceLists.jl file。
【讨论】: