数字列表 - 如何有效地找到小于或等于N的最大值

时间:2013-06-11 18:22:05

标签: c# algorithm

假设我有一组固定的数字正好排序:

static readonly int[] numbers = new int {
    1, 200, 204, 228, 298, 300, 331, 332, ... 2983
};

如何有效地找到小于或等于任意值的最大数字。我想要创建的函数如下:

public int LessThanOrEqualTo(int n)
{
    // ???
}

最简单的方法是每次迭代集合。但是,我正在寻找一种方法来加快速度。我可以将其转换为另一种格式,例如IDictionary,但是不能想到一个聪明的方法来做到这一点。

2 个答案:

答案 0 :(得分:2)

回答了一个非常相似的问题here

  

使用Array.BinarySearch。如果输入在列表中,它将返回索引,如果不是,则它将返回第一个较大值的索引的补码。您只需反转结果并减去一个以获得最接近的较小值的索引。

答案 1 :(得分:0)

如果您无法控制列表的生成

,二进制搜索可能是您的最佳选择

*注意:这是psudocode,并不打算涵盖所有边缘条件

FindLargestLessThan(int val, int[] arr, int hi, int lo)
{
    if(hi == lo)
    {
        // it's either arr[hi] or the element immediately before that.
    }
    else if(arr[(hi+lo)/2] > val)
    {
        return FindLargestLessThan(val, arr, (hi+lo)/2, lo)
    }
    else if(arr[(hi+lo)/2] < val)
    {
        return FindLargestLessThan(val, arr, hi, (hi+lo)/2)
    }
    else if(arr[(hi+lo)/2] == val)
    {
        //found it
    }
    else
    {
        //oops
    }
}