如何跟踪最后一分钟的最大/最小值?

时间:2012-08-30 07:33:56

标签: c# algorithm

我想创建这样的类:

public TrackMaxMin(int periodInSec)

// use current system time as time
public Add(decimal value)

// return maximum Value for the last periodInSec
public Max { get {} }

// return minimum Value for the last periodInSec
public Min { get {} }

我想我可以使用FIFO查询存储Pair<DateTime, decimal&gt;我应该在Add每次{{1}}来电:

  • 从查询中删除“过期”值。删除“更新”时缓存的Max / Min(如果需要)
  • 添加新值。如果需要,更新最大/最小

我的解决方案非常简单明了。你可以提出更好的建议吗?

3 个答案:

答案 0 :(得分:2)

您可以使用名为max-heap的{​​{1}},名为max的{​​{1}}和名为min-heap的{​​{1}}。

min成为包含queueq属性的元素。

调用x时:

  • x.time新元素x.val
  • Add Create到所有数据结构。

x的运行时间为Add

调用x时:

  • Add

O(lgn)的运行时间为Max

调用max.GetMax()时:

  • Max

O(1)的运行时间为Min

为了维护模型,请执行以下操作:

每次min.GetMin()中下一个罢工元素的句号到期时,只有一个计时器被触发。

Min的期限到期时:

  • O(1)qx

答案 1 :(得分:1)

您可以将每对存储在队列中。您应该保持数据至少一分钟,然后在调用Add时删除过时数据。

但是,您应该通过循环堆栈数据来动态计算最大值和最小值,否则您将丢失数据完整性。

答案 2 :(得分:0)

这很方便,

System.Diagnostics.Stopwatch s = new System.Diagnostics.Stopwatch();
s.Start();
s.Stop();
long elapsedms = s.ElapsedMilliseconds;