3

私はを持っていますList<KeyValuePair<double, double>>リストはでソートされKeyValuePair.Keyているので、それは二分探索に修正可能です。そして、私はdoubleオブジェクトを持っています。今、私の仕事はdoubleオブジェクトのインデックスを見つけることです。適用される条件は次のとおりです。

  1. そのdoubleオブジェクトKeyValuePair.Keyが指定された許容範囲内のいずれかに一致する場合、対応するオブジェクトKeyValuePair.Valueが返されます。
  2. doubleオブジェクトがの最大および最小範囲外にある場合はKeyValuePair.Key、0が返されます。
  3. オブジェクトdoubleがの最大最小値内にあるKeyValuePair.Keyが、指定された許容範囲内のいずれにも一致しない場合はKeyValuePair.Key、最も近い上限と最も近い下限の平均を取得しますKeyValuePair.Value(で測定KeyValuePair.Key)。

バイナリ検索の実装がC#で利用できることは知っていますが、それは私のニーズに完全には適合していません。すでに私のニーズを満たしている実装はありますか?他の人がすでに作成、デバッグ、完成したコードの作成とデバッグに数時間を費やしたくありません。

4

1 に答える 1

7

これは、比較ツールと小さなラッパーを使用してかなり簡単に実行できますList<T>.BinarySearch

static double Search(List<KeyValuePair<double, double>> list, double key) {
    int index = list.BinarySearch(
        new KeyValuePair<double, double>(key, 0), 
        new Comparer());

     // Case 1
     if (index >= 0)
         return list[index].Value;

     // NOTE: if the search fails, List<T>.BinarySearch returns the 
     // bitwise complement of the insertion index that would be used
     // to keep the list sorted.
     index = ~index;

     // Case 2
     if (index == 0 || index == list.Count)
        return 0;

     // Case 3
     return (list[index - 1].Value + list[index].Value) / 2;
 }

 class Comparer : IComparer<KeyValuePair<double, double>> {
     public int Compare(
         KeyValuePair<double, double> x, 
         KeyValuePair<double, double> y) 
     {
         if (Math.abs(x.Key - y.Key) < TOLERANCE)
             return 0;

         return x.Key.CompareTo(y.Key);
     }
 }
于 2010-07-13T03:44:51.413 に答える