すでにソートされている配列から数値 X の床と天井を見つけます。例えば
[] = {3、7、9、10、15}
- X=2 の場合、下限 = N/A、上限 = 3
- X=3 の場合、床 = 3、天井 = 3
- X=4 の場合、床 = 3、天井 = 7
- X=16 の場合、床 = 15、天井 = N/A
私たちのほとんどは解決策について知っていると思います。つまり、修正された二分探索によって床/天井を見つけることができます。しかし、修正二分探索の問題は、多くの境界条件を処理する必要があることです。しかし、同じバイナリ検索アルゴリズムが機能することを発見しましたが、フロアの場合は単に書き込む必要がif low > high return low
あり、 ceil のif low > high return high
場合は. また、floor が -1 を返す場合は N/A を表示し、ceil が配列インデックスよりも大きい値を返す場合は N/A を表示します。
フロアのアルゴリズム:
int floorSearch(int a[], int low, int high, int x)
{
if(low > high){
return low;
}
int mid = (low+high)/2;
if(a[mid]>x){
return floorSearch(a, low, mid-1, x);
}
else if(a[mid]<x){
return floorSearch(a, mid+1, high, x);
}
else{
return mid;
}
}
そしてceilの場合:
int ceilSearch(int a[], int low, int high, int x)
{
if(low > high){
return high;
}
int mid = (low+high)/2;
if(a[mid]>x){
return ceilSearch(a, low, mid-1, x);
}
else if(a[mid]<x){
return ceilSearch(a, mid+1, high, x);
}
else{
return mid;
}
}
とても簡単ですね。多くの入力を確認しましたが、機能しますが、アルゴリズムの正確性を証明できませんでした。誰かが正しいことを証明するために試してみることができますか、またはこのアルゴリズムが失敗するサンプル入力を与えることもできます. ありがとう。