Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.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# 查找实数集的快速方法_C#_.net_Algorithm_C# 4.0_Search - Fatal编程技术网

C# 查找实数集的快速方法

C# 查找实数集的快速方法,c#,.net,algorithm,c#-4.0,search,C#,.net,Algorithm,C# 4.0,Search,我在C#4.0中工作,我有以下问题: 给定一个实数的有限集合S和一个参数k(不一定在集合中),查找S中大于或等于k的最小数 显然,我可以使用一个平衡的二叉树来实现这一点。然而,在C#中没有实现这样的数据结构可以帮助我。在C#中有哪些算法选项和可能的实现 编辑: 由于大多数人对批评比对帮助更感兴趣,我将进一步解释: 这是一个算法,它将一个实函数划分成数百万个片段(或像直方图一样的容器),我需要找到包含k的片段,并以有效的方式在其中应用一些计算。这些片段是[a;b]形式的真实间隔,不重叠 我正在设计

我在C#4.0中工作,我有以下问题:

给定一个实数的有限集合S和一个参数k(不一定在集合中),查找S中大于或等于k的最小数


显然,我可以使用一个平衡的二叉树来实现这一点。然而,在C#中没有实现这样的数据结构可以帮助我。在C#中有哪些算法选项和可能的实现

编辑:

由于大多数人对批评比对帮助更感兴趣,我将进一步解释:

这是一个算法,它将一个实函数划分成数百万个片段(或像直方图一样的容器),我需要找到包含k的片段,并以有效的方式在其中应用一些计算。这些片段是[a;b]形式的真实间隔,不重叠

我正在设计的方法需要取给定的k,并且是性能关键的,因为它应该每秒调用数千次。因此,O(n)搜索是不可接受的

在构建S的数据结构上浪费的时间并不重要,也不关键,因为集合只会构建一次,而且永远不会更改(它是一个不变的集合)


我知道我可以使用红黑树,它具有O(logn)搜索复杂度。但是,我想研究其他算法选项(可能还有C#中的现有实现)。

在O(n)时间内解决问题很简单。循环所有元素,跟踪到目前为止满足条件的最小元素(不小于k)

如果使用不同的k重复:二进制搜索排序数组O(logn)


如果最大元素大小是有界的,则类似桶排序的体系结构将提供O(1)个时间。

在O(n)个时间内解决问题很简单。在所有元素上循环,跟踪到目前为止满足条件的最小元素(不小于k)

如果使用不同的k重复:二进制搜索排序数组O(logn)

如果最大元素大小是有界的,则桶式排序结构将提供O(1)个时间。

不是“最快的”,但
排序列表可能“足够快”:

公共静态类扩展
{
公共静态双findSalestGreateThan(此SortedList列表,双值)
{
foreach(list.Keys中的双d)
{
如果(d>值),则返回d;
}
抛出新的IndexOutOfRangeException(“列表中没有大于“+value.ToString()”的值);
}
}
用途如下:

SortedList<double,double> list = new SortedList<double,double>();
list.Add(0.5, 0.5);
list.Add(1.9, 1.9);

double d = list.FindSmallestGreaterThan(1.0);
SortedList=new SortedList();
增加(0.5,0.5);
增加(1.9,1.9);
双d=列表。FindSalestGreater大于(1.0);
不是“最快的”,但是
分类列表可能“足够快”:

公共静态类扩展
{
公共静态双findSalestGreateThan(此SortedList列表,双值)
{
foreach(list.Keys中的双d)
{
如果(d>值),则返回d;
}
抛出新的IndexOutOfRangeException(“列表中没有大于“+value.ToString()”的值);
}
}
用途如下:

SortedList<double,double> list = new SortedList<double,double>();
list.Add(0.5, 0.5);
list.Add(1.9, 1.9);

double d = list.FindSmallestGreaterThan(1.0);
SortedList=new SortedList();
增加(0.5,0.5);
增加(1.9,1.9);
双d=列表。FindSalestGreater大于(1.0);
最简单的方法是(
O(N)
):

最简单的方法是(
O(N)
):

好吧,你可以用一棵红黑相间的树

您可以使用SCG.List或数组,对其排序并使用其方法

你也可以用这个

如果这是家庭作业,你可以推出自己的实现(很可能是教授想要的,我可以想象)。有很多选择。

好吧,你可以使用一棵红黑树,在它的封面下

您可以使用SCG.List或数组,对其排序并使用其方法

你也可以用这个


如果这是家庭作业,你可以自己实现(我想可能是教授想要的)。有很多选择。

那么这是家庭作业还是面试问题?@RQDQ你问这个问题的原因是什么?“在C语言中没有这样的数据结构的实现可以帮助我”-然后实现一个(或查找其他人的实现)!@Аааааааааааааааааааааааааааа?“在C#中没有可以帮助我的数据结构实现”-然后实现一个(或找到其他人的实现)!@Аааааааааааааааааааааааanswer@DStanleySort是O(NLogN)操作,但上面代码的开销是O(N)。(只需*一次遍历列表)平衡二叉树是O(LogN)。@user38397但是你有形成平衡树的成本。我会更新答案。我更新了问题。构建数据结构的成本不重要,也不重要。@user38397然后对集合进行一次排序,并使用二进制搜索,如我的第二个示例中所示(它是
O(LogN)
)。@DStanley sort是O(NLogN)操作,但上面代码的开销是O(N)。(只需*遍历列表一次)平衡二叉树是O(logn)@user38397但是你有成本形成一个平衡的树。我会更新答案。我更新了问题。构建数据结构的成本不重要,也不重要。@user38397然后对你的集合进行一次排序,并使用二进制搜索,就像我的第二个示例(它是
O(LogN)
)。这个代码是O(n),因为我必须遍历整个列表。我不想讨论代码,但要讨论c#中的算法和替代方案。这段代码是O(n),因为我必须遍历t
double k = 3.5;
List<double> S = new List<double>() { 1, 3, 5, 7, 9, 2, 4, 5, 6, 8, 10 };

var min = S.Where(f => f >= k).Min(); //4
List<double> S = new List<double>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

var index = S.BinarySearch(k);
var min = index > 0 ? S[index] : S[~index];