【问题标题】:Scala which data structure is most efficient for my intended operations?Scala 哪种数据结构对我的预期操作最有效?
【发布时间】:2015-06-17 17:12:34
【问题描述】:

我正在运行一个动态编程函数,我在整个过程中携带一个字符串列表。

随着时间的推移,我会将新字符串添加到此列表的末尾,有时我可能会删除最后一个元素。现在我正在使用一个可变的 ListBuffer,对追加执行+=,对删除执行.trimEnd(1)

一旦我的动态编程过程完成,我需要能够有效地访问该列表/序列/等的每个元素,并且按顺序(我插入的第一个项目将首先被访问,而我插入的最后一个项目将是最后一次访问)。

我也尝试过 ArrayBuffers,但它们似乎都太慢了。我正在尝试加快这个过程,我想知道我是否正在使用具有 O(n) 操作的数据结构,而对于我需要的东西可能有 O(1) 时间操作。

【问题讨论】:

    标签: scala arraybuffer listbuffer


    【解决方案1】:

    一个简单的单链表将为您描述的附加/丢弃部分提供 O(1)。最坏的情况是,如果你需要在处理之前反转列表,那将是一个 O(n) 操作支付一次。

    请注意,如果您沿着这条路走,在积累阶段,“first”和“last”将被颠倒(您将通过获取列表的尾部添加项目并删除第一个项目)。

    【讨论】:

    • 有内置的数据类型吗?
    • scala.collection.immutable.List - scala-lang.org/api/2.11.5/…
    • 根据您的后期处理所涉及的内容,您应该查看 foldLeft,如果可以将其表述为累积步骤,它将很自然地为您提供您想要的排序。
    • 不过,这似乎是不可变的。还是我误解了什么实际上是不可变的?我需要能够动态插入和删除项目(我的初始列表将为空)
    • 是的,您不需要更改列表,只需将引用替换为 myList = myList.tail 以删除一个项目,或 myList = newItem :: myList 以添加一个新项目
    猜你喜欢
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    相关资源
    最近更新 更多