6

一見似たような質問: 「配列内の最も近い数値を見つける」(Java) および「倍精度の配列に最も近い一致を見つける」(実際には地理の問題)。

double の (ソートされた) 配列があります。任意の数値 (配列要素の 1 つと完全に一致する場合と一致しない場合があります) が与えられた場合、最も近い数値のインデックスを返すにはどうすればよいですか?

たとえば、次の配列を使用します。

  • 1.8
  • 2.4
  • 2.7
  • 3.1
  • 4.5

2.5 をクエリすると、2.4 の値に対応する 1 のインデックスが返されます。

配列要素の範囲外にある値を検出するためのボーナス ポイント。たとえば、上記の配列を使用すると、コードは 4.6 が入っているが 5.9 が外れていると判断する場合があります。質問のこの部分を試してみたい場合、詳細はあなたの手にあります。

4

5 に答える 5

11

Array.BinarySearch、次を返します。

値が見つかった場合、指定された配列内の指定された値のインデックス。value が見つからず、value が配列内の 1 つ以上の要素より小さい場合は、value より大きい最初の要素のインデックスのビットごとの補数である負の数。value が見つからず、value が array 内のどの要素よりも大きい場合は、(最後の要素のインデックス + 1) のビットごとの補数である負の数。

数値が一致よりも小さいか大きいかがわかるため、これで 100% 到達することはできませんが、チェックするインデックスは 2 つしかありません。

于 2010-11-16T11:43:00.033 に答える
6

LINQ を使用してこれを行う 1 つの方法は次のとおりです。

public int GetClosestIndex( List<double> doublelist, double targetvalue )
{
  return doublelist.IndexOf(doublelist.OrderBy(d => Math.Abs(d - targetvalue)).ElementAt(0));
}

パフォーマンスに問題がある可能性がありますが、リストがそれほど長くない場合は問題になりません。また、2 つの要素がターゲット値から等距離にある場合、それらの最初のインデックスが返されます。

于 2010-11-16T11:49:01.260 に答える
3

おそらく最速の解決策ではありませんが、確かに楽しい目の保養です:

double search;
double[] array;

var nearest = (
    from value in array
    orderby Math.Abs(value - search)
    select value).First();

var index = array.IndexOf(nearest);

これは、配列内の各要素を処理する必要があり、並べ替えはそれらの項目のハッシュ テーブルを構築することを意味するため、二分探索アルゴリズムよりも絶対に遅くなることに注意してください。

于 2010-11-16T11:49:23.547 に答える
0

このようなもの:

double[] values = new double[]
{
    1.8,
    2.4,
    2.7,
    3.1,
    4.5
};

double difference = double.PositiveInfinity;
int index = -1;

double input = 2.5;

for (int i = 0; i < values.Length; i++)
{
    double currentDifference = Math.Abs(values[i] - input);

    if (currentDifference < difference)
    {
        difference = currentDifference;
        index = i;
    }

    // Stop searching when we've encountered a value larger
    // than the inpt because the values array is sorted.
    if (values[i] > input)
        break;
}

Console.WriteLine("Found index: {0} value {1}", index, values[index]);
于 2010-11-16T11:44:43.857 に答える