List
要素をソートして最も近い要素を見つけることができるかどうか疑問に思っていましたそれはそうではないリスト内にあります。
たとえば、値 [1,3,6,7] があり、4 に最も近い要素を探している場合、3 が返されるはずです。これは、3 が配列内で 4 より小さい最大の数字だからです。
英語は私の母国語ではないので、意味が通じることを願います。
ベストアンサー1
コレクションはソートされているため、次のように修正バイナリ検索を実行できますO( log n )
。
public static int search(int value, int[] a) {
if(value < a[0]) {
return a[0];
}
if(value > a[a.length-1]) {
return a[a.length-1];
}
int lo = 0;
int hi = a.length - 1;
while (lo <= hi) {
int mid = (hi + lo) / 2;
if (value < a[mid]) {
hi = mid - 1;
} else if (value > a[mid]) {
lo = mid + 1;
} else {
return a[mid];
}
}
// lo == hi + 1
return (a[lo] - value) < (value - a[hi]) ? a[lo] : a[hi];
}
上記のコードのほとんどはバイナリ検索なので、binarySearch(...)
std ライブラリで提供されている の値を調べますinsertion point
。
public static int usingBinarySearch(int value, int[] a) {
if (value <= a[0]) { return a[0]; }
if (value >= a[a.length - 1]) { return a[a.length - 1]; }
int result = Arrays.binarySearch(a, value);
if (result >= 0) { return a[result]; }
int insertionPoint = -result - 1;
return (a[insertionPoint] - value) < (value - a[insertionPoint - 1]) ?
a[insertionPoint] : a[insertionPoint - 1];
}