私はたくさんのSortedSet<Long>
構造を持っています:
1, 2, 5, 8, 10, 35, 77, ...
5, 9, 35, 50, 132, ...
2, 4, 8, 15, 17, 23, ...
... hundreds of thousands of such rows...
たとえば、後に続く番号を見つける必要があります50
。この例(セットが3つしかない場合)では、です77
。セットの数は膨大で、数十万です。どのアルゴリズムを提案しますか?
私が正しく理解していれば、ここに私の考えがあります:
Collection<SortedSet<Long>> sets = //...
long minAfter50 = Long.MAX_VALUE;
for (SortedSet<Long> set : sets) {
final Long first = set.tailSet(51L).first();
minAfter50 = Math.min(minAfter50, first);
}
これがアイデアです:
更新 ( @beerbajayコメントに基づく): SortedSet が実際に であるTreeSet
場合、次のコードのパフォーマンスが向上する可能性があります。また、すべてのセットに 50 より大きい値があることを確認しています。
long minAfter50 = Long.MAX_VALUE;
for (TreeSet<Long> set : sets) {
final Long higher = set.higher(50L);
if (higher != null && higher < minAfter50) {
minAfter50 = higher;
}
}
それが許可するすべての事前計算である場合、実行できる唯一のことは、各 SortedSet で tailSet を呼び出して、最小値を見つけることです。
追加のデータ構造を許可する場合、最も簡単な方法は、すべてのセットの和集合を追跡し、その上で tailSet を呼び出すだけです。
どちらもあなたが望む答えではないと思います。おそらく、あなたが持っている制約をよりよく説明できますか?
set は二分探索木として実装され、最大数は常に最後になります。50 より大きい数字を簡単に検索できます。各セットで常に 50 より大きい最初の数字を取得します。