.net4 BinarySearch在排序列表中

时间:2012-08-03 15:57:44

标签: c# .net c#-4.0

我想在c#4.0的排序列表中使用二进制搜索选项。我一直在寻找旧的二进制搜索:

How would I search a range of ranged values using C#

我想在如何使用binarySearch在两个日期之间进行范围搜索方面提供一些帮助。我有一个列表,其中有许多日期,我想快速搜索两个日期之间的这个大型列表,并返回找到的项目,如果有的话。我虽然二进制搜索会很快,因为它会很快摆脱不必要的比较,因为它是排序的。

2 个答案:

答案 0 :(得分:1)

假设您的列表是List并且您的日期是DateTime,您可以用这种方式执行List.BinarySearch(...)

List<DateTime> l;
int startIndex = l.BinarySearch(beginDate);
int endIndex = l.BinarySearch(endDate);

此时,您拥有beginDate和endDate之间的日期范围。现在,您可以让它们在两个索引之间进行迭代。

如果要查找最接近的日期以防未找到确切日期,则无法执行二进制搜索。在这种情况下,您需要重新实现您的数据结构(在您的情况下,您的List必须由一些强大的结构替换)以支持范围搜索算法,该算法由二元搜索树组成,您将在每年存储,每个节点将包含一个新的二进制搜索树,它将包含属于该年份的所有月份,现在每个节点将包含一个新的二进制搜索树,该树将包含该月的所有日期,依此类推。

答案 1 :(得分:1)

假设:

  • 您有一个集合,一个有序列表或给定类型T的数组。
  • 所述集合是(允许重复),而不是(唯一商品)。

你需要

  • 进行二元搜索,找到符合您“from”标准的项目,即下限。

    由于这是一个二元搜索而且你有一个而不是 set ,所以不能保证这是符合from条件的集合中的第一个项目。这意味着您需要......

  • 备份到符合“from”条件的第一个项目。这是一个顺序操作。

    此时,您有迭代的起点。您所要做的就是从这一点开始按顺序迭代集合......

  • “通过”标准,上限条件为真。

这可能建议在上限和下限测试中使用自定义比较器。

它也可能以LINQy扩展方法的形式提出解决方案。

祝你好运!