3

こんにちは、スタックオーバーフラワーです!

多くのデータにアクセス/編集する必要がある場合に、最高のパフォーマンスを実現できる最速のデータ構造はどれか疑問に思ったときに、プロジェクトをコーディングしていました。

例を挙げて説明しましょう。User というクラスと Event クラスがあります。ユーザーは多くのイベントを持つことができます。これまで、ArrayList を使用してこの状況を実装してきました。

public class User{
    ArrayList<Event> events;
    public void process(){
    }
    ...
}
public class Event{
    event data like event time etc.
}

私には多くのユーザー(数百万人)がいるため、すべてのユーザーが潜在的に数千のイベントを持つ可能性があり、さらに、プロセス()メソッドを使用してユーザーのすべてのイベントにアクセスする必要があるため、HashMaps などの構造を使用することはできないと思います参考になります(間違っていたら教えてください)。ただし、この要素数では、優れたパフォーマンスが必要であることは明らかです。

では、イベントを処理するための最速のデータ構造は何だと思いますか?

どうもありがとうございました、

マルコ。

4

3 に答える 3

4

これは、特に永続性が必要な場合、および/またはデータがコンピューターのメインメモリに収まらない場合に、データベースにより適したジョブのように思えます。

ただし、独自のコードでこれを行うことを主張する場合は、LinkedHashMapクラスを確認することをお勧めします。これにより、定数 (つまり O(1)) の複雑さで要素に直接アクセスでき、内部リンク リストを組み合わせてすべての要素を高速に反復できます。

もちろん、HashMap構造が役立つかどうかは、何をしたいかによって異なります。たとえば、何らかの識別子に基づいてイベントを検索する場合は、aHashMapが理想的です。

一方、挿入順序に基づいてイベントにアクセスするだけでよい場合は、 よりもはるかに優れた方法はありません。ArrayListこれは、コンテンツへのインデックス付きアクセスが一定の複雑さでサポートされているためです。それらをキューまたはスタックで処理する必要があるだけの場合、Java にはDeque興味のあるインターフェースの実装がいくつかあります。

最後に、キーをランダムに挿入し、基になる構造でそれら自体を並べ替えたい場合は、このTreeMapクラスが役立つことがあります。

于 2012-06-14T08:55:53.313 に答える
1

次の 2 つのことがあります。

1-現在のシナリオでは、同時ユーザーが問題にならない場合は、より高速で単純なデータ構造として arraylist を簡単に使用できます。それ以外の場合、同時ユーザーが問題である場合は、イベントを格納するために vector を簡単に使用できます。

2-キューDSを使用できます。これは、挿入/削除などの動的操作に役立ちます。これは、イテレーターを使用するため、arraylistおよびvecotrよりも高速です。

お役に立てば幸いです。

于 2012-06-14T09:07:57.020 に答える
0

データがメイン メモリに収まる場合、最善の解決策は Java コレクションとプレーン配列です (ランダム アクセス、シーケンシャルの必要性、変更の永続化の必要性などによって異なります)。データが単一のシステム メモリを超えて大きくなる場合は、クラスター化可能な SQL を使用しないソリューション (繰り返しますが、適切なツールの選択は、データをどうしたいかによって異なります)

于 2012-06-14T09:22:10.257 に答える