如何有效地搜索不等式的排序集?

时间:2016-05-11 05:11:09

标签: c# .net-4.0 sortedset

好吧我说我有一个类型为int的强类型SortedSet。我想在集合中找到小于x的最大数字。

也许这是错误的数据结构,但我直观的想法是我有一个排序的集合。当然,我应该能够通过.NET框架进行这种类型的搜索吗?

2 个答案:

答案 0 :(得分:2)

除非我遗漏了某些内容,否则请使用Linq的LastOrDefault扩展方法:

var lastBefore = set.LastOrDefault(num => num < x); // x is your search number
if (lastBefore < set.ElementAt(0))
{
    // Nothing in the set is smaller
}
else
{
    // lastBefore is the last number smaller then search number
}

答案 1 :(得分:2)

由于SortedSet不能通过索引提供直接访问,因此您必须依赖枚举(线性搜索 - O(n))。一种可能更好的方法是使用SortedSet.GetViewBetweenLast,但看起来你不能在不枚举视图中的所有元素的情况下获得最后一个元素。

通过索引直接访问的集合(即List)将允许您使用O(lg n)性能进行二进制搜索 - 因此,如果您需要搜索大量复制到列表,可以使用ToList给出使用List.BinarySearch时可以获得更好的整体性能(它可以为您提供下一个元素的位置)。

// starting sample for BinarySearch approach  
// not handling case where item not in the list (x = 1).
// List have to be sorted which is the case starting from sorted set: sortedSet.ToList()
var list = new List<int>{ 1,3, 5, 7, 8,9}; 
var index = list.BinarySearch(8);
Console.WriteLine(index < 0 ? list[~index - 1] : list[index-1]);