O(n)を実行しないで、与えられた範囲から最小値を求める必要があります。C#与えられた範囲ごとに関数を計算する
配列は、対角線または双曲線である可能性があります。ここでは3つのサンプルの配列です:
var arrDiag1 = new double[10] { 0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5 };
var arrDiag2 = new double[10] { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
var arrHyperbole = new double[10] { 9, 8, 7, 6, 5, 4, 3, 4, 5, 6 };
私は砂漠の演習でラインからの計算のいくつかの並べ替えを構築しようとしたが、それには良いが出てきません。 誰か良いアイデアがありますか?ではなく第二と第三で、それが動作する最初の配列で
private double BinarySearchMin(double[] arr, int left, int leftMiddle, int rightMiddle, int right)
{
if (left == right)
return arr[left];
if (arr[leftMiddle] < arr[rightMiddle])
{
right = rightMiddle;
leftMiddle = ((right - left)/3);
rightMiddle = ((right - left)/3 * 2);
return BinarySearchMin(arr, left, leftMiddle, rightMiddle, right);
}
if (arr[leftMiddle] > arr[rightMiddle])
{
left = leftMiddle;
leftMiddle = ((right - left)/3) + left;
rightMiddle = ((right - left)/3 * 2) + left;
return BinarySearchMin(arr, left, leftMiddle, rightMiddle, right);
}
if (arr[leftMiddle] == arr[rightMiddle])
{
left = leftMiddle;
right = rightMiddle;
leftMiddle = ((right - left)/3) + left;
rightMiddle = ((right - left)/3 * 2) + left;
return BinarySearchMin(arr, left, leftMiddle, rightMiddle, right);
}
return -1;
}
:dasblinkenlightの助けを借りて助け
更新
ため
おかげで私はこの方法を得ることができましたアレイ。 私はここで何が欠けていますか?
明らかにこれは直線では簡単です。最初の2つの値が増えている場合は、minが配列の最初の値、そうでない場合はminが配列の最後の値です。 –