Julia中理想的类似列表的数据结构是什么?
我想要一个带有常量时间追加操作的可索引,可增长的集合。
标准数据结构似乎是Array
push!
操作。这是不变的时间吗?
答案 0 :(得分:9)
正如哈伦所说,push!
是固定时间的摊还。有关参数的原因,请参阅C ++类似数据结构的描述:Amortized analysis of std::vector insertion
如果您想要一个合法的常量时间数据结构,您可能希望实现一个链表。我已经看过很多样本实现,但没有任何可以用于生产的内容。
答案 1 :(得分:4)
反复调用push!
不是恒定时间,但速度非常快。它偶尔会对缓冲区进行指数式重新分配。请参阅C源代码以附加到数组:https://github.com/JuliaLang/julia/blob/master/src/array.c#L564
答案 2 :(得分:0)
差异列表使您可以在固定时间内追加,前置和连接。我昨天here推送了一个实现。确实只有几行代码,但是我增加了对迭代和显示的支持,使它变得更奇特。
您可以使用dl
函数创建差异列表,如下所示:dl(1, 2, 3)
或为可以使用todl(items)
进行迭代的任何内容创建差异列表。
您可以使用concat
函数连续地连接任意数量的差异列表,如下所示:concat(dl(1, 2), dl(3, 4))
。
您可以使用pushfirst
和push
以恒定的时间添加到起点和终点。
差异列表可以迭代,因此您可以在for循环和splat中使用它们,并轻松地将它们转换为数组。
我正在等待它以Julia程序包的形式发布,但是您可以直接使用the DifferenceLists.jl file。