过滤(可能)1.000.000+项的子集

时间:2010-12-10 08:58:04

标签: c# .net algorithm search filtering

我有一个很大的dataset,可能有超过一百万个条目。所有项目都有一个指定的时间戳,并且项目在运行时添加到集合中(通常但不总是使用较新的时间戳)。 我需要在给定的时间范围内显示该数据的子集。与总数据集相比,该时间范围通常非常小,即在该给定时间范围内不超过约1000的1.000.000+项目。该时间范围以恒定的速度移动,例如,每秒钟的时间范围都会移动一秒钟。 此外,用户可以随时调整时间范围(“移动”数据集)或设置其他过滤器(例如按某些文本过滤)。

到目前为止,我并不担心性能,试图让其他事情正确,只能使用较小的测试集。我不太确定如何有效地解决这个问题,并且很乐意为每一个输入。感谢。

编辑:使用的语言是C#4。

更新:我现在使用的是间隔树,可以在这里找到实现: https://github.com/mbuchetics/RangeTree

它还带有一个异步版本,它使用任务并行库(TPL)重建树。

3 个答案:

答案 0 :(得分:3)

我们在开发过程中遇到了类似的问题 - 必须收集按某些键排序的数百万个项目,然后根据需要导出一个页面。我看到你的问题有点类似。

为此目的,我们通过以下方式调整了red-black tree结构:

  • 我们在其中添加了迭代器,因此我们可以在o(1)
  • 中获得“下一个”项目
  • 我们添加了从'index'中找到迭代器,并设法在O(log n)中执行此操作

RB Tree具有O(log n)插入复杂度,所以我猜你的插入很适合。

迭代器上的

next()是通过添加和维护所有叶节点的链表来实现的 - 我们最初采用的RB Tree实现不包括这个。

RB Tree也很酷,因为它允许您根据需要微调节点大小。通过试验,您将能够找到适合您问题的正确数字。

答案 1 :(得分:1)

使用按时间戳排序的SortedList

所有你需要的是在排序列表中的排序键上实现二进制搜索,以找到选择的边界,这很容易。

答案 2 :(得分:0)

将新项目插入已排序的列表中。这样可以让您轻松选择范围。如果你熟悉它,你也可以使用linq。