2012-10-02 6 views
12

この投稿はscala.collection.mutable.LinkedListについて書かれています。他の実装はこのスレッドのトピックではありません。LinkedListの使用例

私の質問は:このクラスのユースケースは何ですか?私はそれが可変でも不変でもないタイプの構造の問題を抱えているのに対し、何の利益ももたらさないことがわかります。私はので、と言う:それは不変のAPI(filtermapdroptakeなど全てがインプレース変更を新しいLinkedListを返す代わりにやって)

  • であるかのように

    • APIは、私には見えるすべて不変のリンクリストの利点は、それらがvar elemvar nextて(まだ変更可能ですので、少なくとも私は、すなわち構造物との間の最大の共有、存在しないと思い、ある。

    のでbasicly我々は、線形アクセス時間を持って、リニアAP (O(1)の前置詞を除いていますが、まだ不変なリストの場合もあります)。

    このタイプの構造の重要な利点を確認できませんか?私は客観的な尺度やユースケースをこのクラスに適用可能なものとして探しています。

  • +1

    不変クラスの周りに薄いラッパーのように見えます。利点:誰でもそれを書いた人は、バグの導入を心配することなく、すばやくそれを行うことができましたか? – bdares

    +4

    @bdaresあなたはそれを何と考えますか?私はソースをすばやく見ていて、そんなことはないようです。 –

    +0

    hmmm ...任意の可変型と同様に、複数のポインタから参照でき、一度編集すると、すべてのポインタから変更が見えます。これは時間の複雑さとは関係がありません。 – Oren

    答えて

    4

    私はその理由が複雑だと言いたいと思います。リンクリストクラスでは、リストの途中でノードへの参照を保持し、そのノードではinsertまたはupdateを使用します。リスト。私は場所を正確に、いくつかの配列の変化は、(myReference上記)が起こることを知っているアプリケーションで

    [] --> [] --> ... --> [] --> ... --> [] --| 
    ^     ^
    head     myReference 
    

    immutable.Listの場合のように、(その場所にすべてをコピーするよりも、その場所を変更するには、はるかに少ないコストつまり、私はちょうどmyReferenceの後に新しいノードを挿入します)。

           myNewNode 
              v 
    [] --> [] --> ... --> [] --> [] ---> ... --> [] --| 
    ^     ^
    head     myReference 
    

    このようなアプリケーションの例 - 文字列の一部を展開するL-system。展開する必要があるたびに文字列全体をコピーするよりも、新しいノードをインプレースに挿入するほうがはるかに安いです。

    もう一つの理由は、完全である - DoubleLinkedListLinkedListLikeので、余分なLinkedListクラスを提供し、共通のインフラストラクチャの多くを共有するには、標準ライブラリのサイズに低コストとして来ました。

    +0

    十分な理由があります。私は不思議に思っていますが、マップやフィルターなどのインプレイスイディオムの実装がない特別な理由はありますか? – m09

    +0

    これについて多くの議論がありました。これは部分的には、パフォーマンス上の理由のために、多くのものが実装されていないか、あるいは全く実装されていない(「Array」や「パッチ」、さらには「flatMap!インプレース更新はコピー更新よりも必ずしも高速であるとは限りません)、名前付けの問題が原因です。しかし、変更可能なシーケンスで一般的に実装可能な操作は1つあり、それは 'transform'です。これは単にすべての要素に対して' update'を呼び出すだけです。 – axel22

    +0

    それは私にとってちょっと意味がありますが、その実装が可能な最も一般的な特性が空になっているのはなぜかと思います。とにかく、実装するのが難しくないと思うし、APIのノイズを減らすことは、既に実装されている実装を与えることよりも好ましいことです。ありがとう:) – m09

    関連する問題