数字列表-如何有效地找到小于或等于N的最大值
本文关键字:最大值 小于 列表 有效地 数字 | 更新日期: 2023-09-27 18:17:59
假设我有一组固定的数字,这些数字恰好是排序的:
static readonly int[] numbers = new int {
1, 200, 204, 228, 298, 300, 331, 332, ... 2983
};
我如何有效地找到小于或等于任意值的最大数字。我试图创建的函数如下所示:
public int LessThanOrEqualTo(int n)
{
// ???
}
最简单的方法是每次迭代该集合。然而,我正在寻找一种方法,使这更快。我可以将其转换为另一种格式,例如IDictionary
,但无法立即想到一种聪明的方法。
这里回答了一个非常相似的问题。
Array.BinarySearch使用。如果输入在列表中,它将返回索引,如果不在列表中,它将返回第一个较大值的索引的补集。你只需要把结果反过来,然后减去1,就可以得到最接近的小值的索引。
如果你不能控制列表的生成,二进制搜索可能是你最好的选择
*注意:这是伪代码,它不打算覆盖所有的边缘条件
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
}
}