【问题标题】:.net4 BinarySearch in a sorted List.net4 BinarySearch 在排序列表中
【发布时间】:2012-08-03 15:57:44
【问题描述】:

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

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

我想要一些关于如何使用 binarySearch 在两个日期之间进行范围搜索的帮助。我有一个包含许多日期的列表,我想在两个日期之间快速搜索这个大列表并返回找到的项目(如果有的话)。我认为二进制搜索会很快,因为它会在排序时迅速摆脱不必要的比较。

【问题讨论】:

标签: c# .net c#-4.0


【解决方案1】:

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

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

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

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

【讨论】:

  • beginDate 不在列表中时怎么办。即它的小时数不同? index为负数时OP应该怎么做?
  • 这取决于你想做什么。如果索引为 -1,则表示 beginDate 不存在,因此您可以显示一个消息框,说明未找到 beginDate,或者如果未找到 beginDate 或 endDate,您可以执行“查找最近”
  • 当您进行范围搜索时,您可能不会得到 exact 匹配。由于 DateTime 比较即使在几秒钟内也需要相等。因此,获得负索引是正常情况,应该在代码中处理,而不是通过给出消息。我认为你的答案应该包括所有这些。
  • @L.B 我已经编辑了原始答案,解释了如何进行最近的查找。如果您有任何疑问,请告诉我
  • 我希望你说“如果你得到一个负索引,比如 startIndex,那么你可以使用~startIndex 作为开始搜索的偏移量。”
【解决方案2】:

假设:

  • 您有一个给定类型 T 的集合、有序列表或数组。
  • 所说的集合是一个bag(允许重复)而不是一个set(独特的项目)。

你需要

  • 进行二分搜索以找到符合您的“来自”条件的项目,即下限。

    由于这是一个二分搜索,并且您有一个 bag 而不是 set,因此不能保证这是集合中满足 from 条件的第一个项目.这意味着您需要...

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

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

  • 虽然“通过”条件,但上限条件为真。

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

它还可能建议采用 LINQy 扩展方法形式的解决方案。

祝你好运!

【讨论】:

  • 不确定 OP 是否有包或套装。如果他的意思是SortedList,那么它不允许重复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-15
  • 1970-01-01
  • 2015-09-16
  • 1970-01-01
  • 2012-07-28
  • 2021-12-02
  • 1970-01-01
相关资源
最近更新 更多