我在C#4.0工作,我遇到以下问题:
给定实数的有限集合S和参数k(在集合中不必要),找到 S中的最小数字大于或等于k 。
显然,我可以使用平衡二叉树来实现。但是,在C#中没有实现这样的数据结构可以帮助我。 C#中的算法和可能的实现有哪些选项?
编辑:
由于大多数人对批评比对真正的帮助更感兴趣,我会解释更多:它是一种算法,它将一个真实的函数分成数百万个(或二进制,如直方图),我需要找到包含k in的部分,并在其中应用一些计算的有效方法。这些片段是形式的实际间隔[a; b)并且不重叠。
我正在设计的方法需要取得一块,给定k,并且性能至关重要,因为它应该每秒调用数千次。因此,O(n)搜索是不可接受的。
构建S的数据结构所浪费的时间并不重要且不重要,因为该集只会构建一次并且永远不会改变(它是一个不可变集)。
我知道我可以使用红色黑树,它具有O(log n)搜索复杂度。但是,我想调查其他算法选项(可能还有C#中的现有实现)。
答案 0 :(得分:2)
在O(n)时间内解决问题是微不足道的。循环遍历所有元素,跟踪到目前为止发现的最小元素(不小于k)。
如果用不同的k重复:二进制搜索排序的数组O(log n)
如果最大元素大小是有界的,那么像体系结构这样的桶类将给出O(1)时间。
答案 1 :(得分:2)
最简单的方法是(O(N)
):
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
如果您的列表已经排序,那么费用为O(LogN)
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];
答案 2 :(得分:1)
好吧,你可以使用SCG.SortedSet,这是一个红黑树。
您可以使用SCG.List或数组,对其进行排序并使用其BinarySearch()方法。
您也可以使用C5 Collections Library。
如果这是家庭作业,你可以推行自己的实施(可能是教授想要的,我想象)。很多o'options在那里。
答案 3 :(得分:0)
不是“最快”但SortedList
可能“足够快”:
public static class Extensions
{
public static double FindSmallestGreaterThan(this SortedList<double,double> list, double value)
{
foreach(double d in list.Keys)
{
if(d > value) return d;
}
throw new IndexOutOfRangeException("No values in the list greater than " + 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);