C# 删除某些元素后在集合中高效地查找新的最大元素

C# 删除某些元素后在集合中高效地查找新的最大元素,c#,algorithm,optimization,C#,Algorithm,Optimization,我们有一些带有n数据点的图(如带轴的可视图),其中n可能相当大。数据可以表示为x坐标和y坐标的双格式一致列表或数组,并对x值进行排序。x值和y值之间可能存在重复项,并且两者都可能包含负值。此外,y值可以包含NaN的值 每次更新数据时,我们都需要重新计算y值的最大值,以更新图形轴上的最大值。如果插入数据点,这很容易,因为我们可以将新值与当前最大值进行比较,看看是否超过了该值。但是在删除数据点时,我们需要检查更多的数据 通常,会删除一系列值,例如从索引i和以下m索引中删除(我们总是将此信息作为索引和

我们有一些带有
n
数据点的图(如带轴的可视图),其中
n
可能相当大。数据可以表示为x坐标和y坐标的双格式一致列表或数组,并对x值进行排序。x值和y值之间可能存在重复项,并且两者都可能包含负值。此外,y值可以包含
NaN
的值

每次更新数据时,我们都需要重新计算y值的最大值,以更新图形轴上的最大值。如果插入数据点,这很容易,因为我们可以将新值与当前最大值进行比较,看看是否超过了该值。但是在删除数据点时,我们需要检查更多的数据

通常,会删除一系列值,例如从索引
i
和以下
m
索引中删除(我们总是将此信息作为索引和数据列表中的范围接收)。我们当前的策略是找到删除的
m
数据点的最大值,并将其与整个数据集的当前最大值进行比较。如果其中一个匹配,则从剩余的
n-m
数据点重新计算并更新。这意味着我们很少需要检查所有
n
数据点

…但我们宁愿完全避免这种情况。当前删除操作的平均运行时间为O(1)(我认为),但最坏情况为O(n)。是否有某种方法可以从集合中删除一个元素,并在像O(logn)这样的东西中找到集合的新最大值,这对于我们的用户来说是不可见的?如果需要,我们可以创建和存储其他同等大小的列表和数组

我们已经考虑过将数据划分为段,每个段都有自己的最大值,但是由于remove操作会更改基础数据的索引,因此我们需要一种有效的方法来链接它们,而无需重新计算所有索引。我们还考虑使用
分类数据集
,但集合不允许重复


我希望有人能给我们指出一个解决方案,或者出乎意料地告诉我们,这种方法已经达到了最高效率。

(对接近票数的人来说:我看不出这是如何基于意见的)当数据发生变化时,您是否重新绘制了图表?如果是这样,我会认为绘图时间会使重新计算最大Y值所需的时间相形见绌。(您可能永远不需要显式地找到max X值,因为您的数据已经按X排序)我认为,您的图形组件必须至少查看每个数据点一次。因此,相比之下,即使是在整个范围内快速输入O(n),也应该相当便宜。关于分区的一个想法:当新数据进入/删除时,您需要重新分区,但是分区可以在您将数据发送到图形组件进行绘制后完成,因此不会出现在关键路径上。您是否计时了在O(N)操作中查找最大Y值所需的时间?我刚刚尝试了一个基本循环,以在一个1000万倍的数组中找到最大值,在我的PC上大约需要1/100秒(发布版本),所以我想知道你是否只是在浪费时间。可能有兴趣: