【问题标题】:Recommended data structure in Julia for efficient appendJulia中推荐的数据结构以实现高效附加
【发布时间】:2014-01-10 19:34:40
【问题描述】:

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

我想要一个具有恒定时间追加操作的可索引、可增长的集合。

标准数据结构似乎是Arraypush! 操作。这是恒定的时间吗?

【问题讨论】:

    标签: julia


    【解决方案1】:

    正如 Harlan 所说,push! 是摊销常数时间。原因见 C++ 类似数据结构的描述:Amortized analysis of std::vector insertion

    如果您想要一个合法的恒定时间数据结构,您可能想要实现一个链表。我已经看过很多示例实现,但没有一个可以投入生产。

    【讨论】:

    • 摊销常数时间对我来说没问题!主要是我很好奇。
    【解决方案2】:

    反复调用push! 不是固定时间,但速度非常快。它偶尔对缓冲区进行指数重新分配。附加到数组请参见 C 源代码:https://github.com/JuliaLang/julia/blob/master/src/array.c#L564

    【讨论】:

      【解决方案3】:

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

      您可以使用 dl 函数创建差异列表,如下所示:dl(1, 2, 3) 或为您可以使用 todl(items) 迭代的任何内容创建差异列表。

      您可以使用concat 函数在恒定时间内连接任意数量的差异列表,如下所示:concat(dl(1, 2), dl(3, 4))

      您可以使用pushfirstpush 以恒定时间添加到开始和结束。

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

      我正在等待它作为 Julia 包发布,但您可以直接使用 the DifferenceLists.jl file

      【讨论】:

        猜你喜欢
        • 2013-08-20
        • 1970-01-01
        • 1970-01-01
        • 2013-06-25
        • 2015-06-26
        • 1970-01-01
        • 2010-11-14
        • 2011-05-18
        • 1970-01-01
        相关资源
        最近更新 更多