Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 数字列表-如何有效地查找小于或等于N的最大值_C#_Algorithm - Fatal编程技术网

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

C# 数字列表-如何有效地查找小于或等于N的最大值,c#,algorithm,C#,Algorithm,假设我有一组固定的数字,这些数字恰好被排序: static readonly int[] numbers = new int { 1, 200, 204, 228, 298, 300, 331, 332, ... 2983 }; 如何有效地找到小于或等于任意值的最大数。我尝试创建的函数如下所示: public int LessThanOrEqualTo(int n) { // ??? } 最简单的方法是每次迭代集合。然而,我正在寻找一种方法,使这更快。我可以将其转换为另一种格

假设我有一组固定的数字,这些数字恰好被排序:

static readonly int[] numbers = new int {
    1, 200, 204, 228, 298, 300, 331, 332, ... 2983
};
如何有效地找到小于或等于任意值的最大数。我尝试创建的函数如下所示:

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

最简单的方法是每次迭代集合。然而,我正在寻找一种方法,使这更快。我可以将其转换为另一种格式,如
IDictionary
,但我想不出一种灵巧的方法来立即执行此操作。

如果您无法控制列表的生成,则二进制搜索可能是您的最佳选择

*注意:这是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
    }
}
FindLargestLessThan(int val,int[]arr,int hi,int lo)
{
如果(hi==lo)
{
//要么是arr[hi],要么就是前面的元素。
}
否则如果(arr[(高+低)/2]>val)
{
返回值小于(val,arr,(高+低)/2,低)
}
否则如果(arr[(高+低)/2]
回答了一个非常类似的问题

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


进行二进制搜索?注意“如果找到项;否则,一个负数是大于项的下一个元素索引的位补码”,因此如果没有找到,则得到下一个较大的元素,然后可以向后移动一个索引以获得所需的元素@AaronLS注意到,在这种情况下,它将是
Array.BinarySearch
而不是列表版本。这不完全是二进制搜索,尽管合并二进制搜索可能是个好主意。@MattGreer这完全是二进制搜索,事实上。如果你能控制列表的生成,你会做什么不同的事情呢?@Servy你可以做一些散列的实现。散列用于查找精确的值,而不是“接近”的值。任何时候你想要找到满足除等式散列以外的其他条件的值,除了极少数情况外,在所有情况下都会出现故障。这不仅是相似的,而且是完全重复的。在这种情况下,您可以投票/标记关闭。@Servy有一个非常小的区别<我不知道该怎么做。我是新来的。从现在起我会的,谢谢。