c# - 在集合中查找具有相同值的 block 并操作周围的值

标签 c# linq collections

我真的不知道如何概括标题中的问题,抱歉。 :)

假设我有一个包含数千个对象的集合(即 ObservableCollection)。这些对象由一个升序时间戳和一个 FALSE bool 值(非常简单)组成。

像这样:

[0] 0.01, FALSE
[1] 0.02, FALSE
[2] 0.03, FALSE
[3] 0.04, FALSE
...

现在,我们假设在此集合中,有一些 block 的标志设置为 TRUE

像这样:

[2345] 23.46, FALSE
[2346] 23.47, FALSE
[2347] 23.48, FALSE
[2348] 23.49, TRUE
[2349] 23.50, TRUE
[2350] 23.51, TRUE
[2351] 23.52, TRUE
[2352] 23.53, TRUE
[2353] 23.54, FALSE
[2354] 23.55, FALSE
...

我需要找到 block 并将 block 前后 1.5 秒内的所有标志设置为 TRUE。 如何在保持合理性能的同时实现这一目标?

最佳答案

Matthias G 的解决方案是正确的,尽管相当慢 - 似乎具有 n 平方复杂度。

第一个算法扫描输入以按IsActive过滤它们,检索时间戳并放入一个新列表中 - 这至少是O(n)。然后它扫描构建的列表,在最坏的情况下可能是整个输入 – O(n),并且对于检索到的每个时间戳,它扫描输入以修改其中的适当值 – O(n^2 )。 然后它会构建额外的列表,仅扫描一次并销毁。

我提出了一个类似于归并排序的解决方案。首先扫描输入值,并将每个事件项目的适当时间间隔推送到队列中。您可以延迟推送以查看下一个间隔是否与当前间隔重叠 - 然后延长间隔而不是推送。当输入列表完成后,最后推送最后一个延迟间隔。这样您的队列将包含您要修改的(几乎)最小数量的时间间隔。

然后再次扫描数据并将时间戳与队列中的第一个间隔进行比较。如果该项目的时间戳落在当前间隔内,则将该项目标记为“事件”。如果超过了间隔,则从队列中删除该间隔,并将时间戳与下一个时间戳进行比较,依此类推,直到该项目位于间隔内或之前。您的输入数据按时间顺序排列,因此间隔也将按相同顺序排列。这允许通过两个列表的单次并行传递来完成任务。

关于c# - 在集合中查找具有相同值的 block 并操作周围的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22531618/

相关文章:

c# - 为什么 XML-Serializable 类需要无参数构造函数

java - 我可以从子列表中检索开始和结束索引吗?

c# - 如何将PCM数据转换为wav文件?

c# - 扩展方法的有效权重(在设计时、运行时等)

JAVA 调用属性等于字符串的对象数组方法的最佳方法是什么?

c# - 通过 LINQ Select 调用生成新线程是否是错误代码?

c# - 无法使用linq选择进入类

Java 8 列表到 map 的转换

mysql - 拉拉维尔 : how to query the result of query scope

c# - C# 中的公式生成