私は、バイナリ検索が欠落している要素の挿入ポイントを返すという事実をきれいな方法でコーディングする方法を理解しようとしています。
これを、重複しない間隔の最大サブセットを見つけるというアルゴリズムの問題に使用します。
私がしていることは、間隔を並べ替えた後、各間隔を維持し、その開始時間が既に選択されている間隔の終了時間と重ならないようにすることです。
線形探索もできますが、ここでは二分探索の方がいいと思いました。私は正しいですか?
したがって、正しいように見えますが、エラーが発生しやすく、API をより適切に使用できる可能性があると思います。
私が行っているのは、最後の間隔でのバイナリ検索であり、前または次と重複するかどうかを確認します (バイナリ検索によって返された挿入ポイントを使用)。
私の論理は正しいですか?また、このアルゴリズムは良い練習になると信じているので、クリーンな Java バージョンを探しています。
private boolean nonOverlapping(Pair interval, SortedSet<Pair> selectedIntervals) {
if(selectedIntervals.isEmpty())
return true;
if(selectedIntervals.contains(interval)){
return true;
}
Pair[] sortedSelections = selectedIntervals.toArray(new Pair[0]);
int pos = Arrays.binarySearch(sortedSelections, interval, new Comparator<Pair>() {
@Override
public int compare(Pair o1, Pair o2) {
return o1.getStart() - o2.getEnd();
}
});
pos = (-pos) -1;
if(pos == sortedSelections.length){
if(sortedSelections[pos - 1].getEnd() < interval.getStart()){
return true;
}
}
else if(sortedSelections[pos].getEnd() > interval.getStart()){
if(pos + 1 < sortedSelections.length){
if(sortedSelections[pos + 1].getEnd() < interval.getStart()){
return false;
}
}
if(pos - 1 >= 0){
if(sortedSelections[pos - 1].getEnd() < interval.getStart()){
return false;
}
}
return true;
}
return false;
}