2017-01-09 6 views
0

データ属性を持つすべてのオブジェクトを効率的に検索できるデータ構造(Java組み込みのコレクションクラスを使用することをお勧めします)を探していますXより大きい。割り当てシステムの一部になります。例えば少なくとも属性があるオブジェクトを検索して使用するためのJavaデータ構造X

、私はいくつかの公共交通機関のバスとその能力を持っているとします

Bus 1: capacity 20 
Bus 2: capacity 12 
Bus 3: capacity 24 

今、私は、次の割り当てをしたいと思い:

Group 1: 16 passengers 
Group 2: 19 passengers 

グループ1は、効率的にバス1を見つける必要があります(バス)1にグループを割り当てることができます。

グループ2は、バス1またはバス3を効率よく見つけ、そのバス1が占有されていることを確認し、そのグループをバス3

ここでどのようなデータ構造が必要ですか?

必要な容量を満たすバスを見つけるには、O(lg N)時間でバイナリ検索を行い、必要な人数に一致する最小容量を見つけ出し、O(N)その番号以上のバス。

最終的な割り当てを行うために、一致するバスを選択するにはどうすればよいですか?(たとえば、グループ2は既に占有されているバス1とバス3のどちらかを選択する必要がありますか?

+1

一般的に、探しているJavaコレクションフレームワークの操作は 'TreeSet.tailSet'と' TreeMap .tailMap'を設定します。しかしそれがあなたが始める場所です。 –

+0

@LouisWasserman:うん、 'TreeSet.tailSet()'は私が探していたものだった。ありがとうございました。 – stackoverflowuser2010

答えて

0

私はあなたがO(LG N)+ O(N)を使用して達成することができると思う。..

まず、私はそれが占有していますことをマーキングするためのバスタイプにフラグを追加します。 この結果得られたコレクションの容量がソートされている場合は、O(lg N)のグループよりも容量が小さい(たとえばX)バス バスにアクセスできます。

次に、最初の空きバスが見つかるまで、XからO(N)の最大値までコレクションをトラバースできます。

+0

O(lg N)で最初に検索して容量に合ったバスを見つけてから、一致するバスでO(N)を検索するので、O(lg N)+ O – stackoverflowuser2010

+0

はい..正しいです..間違いを修正しました.. – sharpcodes

0

あなたの仕様に基づいて、私は何かを提案します。

@lombok.Data 
@AllArgsConstructor 
public class Group { 
    private Integer id; 
    private Integer size; 
} 

@lombok.Data 
@AllArgsConstructor 
public class Bus { 
    private Integer id; 
    private Integer capacity; 
    private Boolean occupied; 
} 

私は、最初の並べ替えのO(lg N)なしでストリームAPIフィルタを使用してこれをO(N)に取得できると思います。あなたはバスのコレクションを持っていると仮定すると、O(N)で利用可能なバスを見つけるための方法は、私はバランスの取れた、バイナリ検索ツリーを使用することになり、この

public Optional<Bus> getAvailableBus (Group group) { 
    return buses.stream().filter(
      bus -> bus.getCapacity() >= group.getSize() && !bus.isOccupied()).findFirst(); 
} 
0

ようになります。 「Ceil」は正しいバスを見つけるのに役立ちます。 "Ceil"はO(log N)操作です。このバスを見つけたら、それをツリーから削除します。それはバランスの取れたバイナリツリーなので、再度deleteはO(log N)操作です。ログNの複雑さでこれらの操作を行う左に傾いている赤い黒色ツリーの完全な実装はここにあります: http://algs4.cs.princeton.edu/33balanced/RedBlackBST.java.html

関連する問題