単一スレッド環境でremove(i: Int)
のような索引削除をたくさん行うつもりならば、scala.collection.mutable
パッケージの実装はどうすればいいですか?最も明白な選択肢、ListBuffer
は、バッファサイズに応じて線形時間がかかることがあると言います。 log(n)
のコレクションがありますか?スカラ:可変シーケンスの中で最も速い `remove(i:Int)`
答えて
buf remove i
を含む削除演算子は、Seq
の一部ではありませんが、scala.mutable
の下に実際にはBuffer
という特性の一部です。 (Buffers参照)
Performance Characteristicsの最初の表を参照してください。私はbuf remove i
は、インサートと同じ特性を持っていると推測しています。それはArrayBuffer
とListBuffer
の両方に対して線形です。 Array Buffersに記載されているように、それらは内部的に配列を使用し、Link Buffersはリンクされたリストを使用します(削除のためにはまだO(n)です)。
不変のVectorは、有効な一定時間を与える場合があります。
ベクトルは高い分岐係数を持つツリーとして表されます。すべてのツリーノードには、最大32個の要素が含まれているか、または最大で32個の他のツリーノードが含まれています。 [...]したがって、合理的なサイズのすべてのベクトルに対して、要素の選択には、5つまでのプリミティブ配列の選択が含まれます。これは、要素のアクセスが「実質的に一定の時間」であると書いたときの意味です。
scala> import scala.collection.immutable._
import scala.collection.immutable._
scala> def remove[A](xs: Vector[A], i: Int) = (xs take i) ++ (xs drop (i + 1))
remove: [A](xs: scala.collection.immutable.Vector[A],i: Int)scala.collection.immutable.Vector[A]
scala> val foo = Vector(1, 2, 3, 4, 5)
foo: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3, 4, 5)
scala> remove(foo, 2)
res0: scala.collection.immutable.Vector[Int] = Vector(1, 2, 4, 5)
データサイズが非常に大きくなるまで注意は、しかし、オーバーヘッドの多くが付いている高い一定の時間が素早くリニアにアクセスを獲得しないことがあります。
正確な使用例に応じて、LinkedHashMap
をscala.collection.mutable
から使用できる場合があります。
インデックスで削除することはできませんが、一定時間内に一意のキーで削除できますし、反復処理時に確定的な順序を保持します。
scala> val foo = new scala.collection.mutable.LinkedHashMap[String,String]
foo: scala.collection.mutable.LinkedHashMap[String,String] = Map()
scala> foo += "A" -> "A"
res0: foo.type = Map((A,A))
scala> foo += "B" -> "B"
res1: foo.type = Map((A,A), (B,B))
scala> foo += "C" -> "C"
res2: foo.type = Map((A,A), (B,B), (C,C))
scala> foo -= "B"
res3: foo.type = Map((A,A), (C,C))
イェップ、素晴らしい提案をいただきありがとうございます。しかし、このアプローチには独自の制限があります( 'Index'がなく、' Seq'を継承しません)。しかしそれはいいです。 – incarnate
- 1. 3つのシーケンスの中で最も長い共通サブシーケンス
- 2. Lispの中で最も長い順番の減少シーケンス
- 3. JavaScriptの中で最も速い斜交ですか?
- 4. 小規模コレクションの中で最も速い並べ替え
- 5. 3つの文字列の中で最も長い共通部分シーケンス
- 6. DelayQueueが高速のremove()ですか?
- 7. スカラの将来のシーケンスとタイムアウト処理
- 8. 変更可能なスカラ不変マップ、いつ変更可能ですか?
- 9. 最も速いjQuery autoellipsisプラグインですか?
- 10. これはC++での入力方法の中で最も速いものです
- 11. 最も速いJavaベースのJavascriptエンジン
- 12. 最も速いOpenCV 2 OpenGLのコンテキスト
- 13. シーケンスで可変コレクションを折り返す
- 14. スカラ速度テストとプロファイラ
- 15. 最も速いキー値nosqlデータベース
- 16. 最も速いDijkstraアルゴリズムfor j2ME
- 17. リストの中で最も早いものを選択する
- 18. Cで最も速くデインターリーブ動作?
- 19. .NETオブジェクトリレーショナルマッパーが最も高速ですか?
- 20. Java用の最も高速で自由に再配布可能なデータベース
- 21. Oracleによる許可変更シーケンス
- 22. PHPで最も速いのはどれですか?
- 23. unixtimeからnumpy.datetime64に変換する最も速い方法は何ですか?
- 24. 可変速度ネットワークでのシリアライゼーション遅延
- 25. 各要素から最も長い部分シーケンスを増やす
- 26. REMOVEは実際には同じシーケンスを返しますか?
- 27. netTcpBindingの最も速いセキュリティ設定は何ですか?
- 28. 最も速いAndroid SDKの設定は何ですか?
- 29. アレイの初期化は最も速いですか?
- 30. 圧縮+エンコーディング+チェック+配列のシリアル化の中で最も速い組み合わせは何ですか?
は、彼は「私がインデックス削除は、挿入と同じ特性を持って推測しています」と言う理由です – Ron
「削除」のための最初のテーブルには列がありません。 –
@Alexey Romanov @Ronがそれを指摘した後、私は上記の答えをほとんど追加しました。 –