不精确的二进制搜索:给定值,找到元素位置的上下索引

时间:2010-07-13 03:26:57

标签: c# binary-search

我有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衡量)。
  4. 我知道C#中提供了二进制搜索实现,但它并不完全适合我的需求。我想问一下那里是否有满足我需求的实施方案?我不想花几个小时编写和调试其他人已经编写,调试和完善的代码。

1 个答案:

答案 0 :(得分: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);
     }
 }