這是散步列表解決方案。我也包括一對開放和關閉。 (因爲我期望這就是你的數據存儲的方式。)由於步行需要在關閉之前打開,所以我在s中添加了它,並且不僅僅按日期排序,並且需要創建Event對象的順序。如果收盤時有收盤價出現,這將失敗。
這是用linqpad編寫和測試的。將它複製並粘貼,並且它將會運行。得到它(然後愛它)在LinqPad.com
我期望這是O(日誌n),因爲OrderBy
應該是O(日誌n)。
void Main()
{
List<Event> eList = new List<Event>();
eList.Add(new Event(new DateTime(2000,1,1),new DateTime(2000,5,1)));
eList.Add(new Event(new DateTime(2000,2,1),new DateTime(2000,2,1)));
var datelist = eList.Select(item => new { t = "open", d = item.open, s = item.open.Ticks*10 })
.Concat(eList.Select(item => new { t = "close", d = item.close, s = (item.close.Ticks*10)+1 }))
.OrderBy(item => item.s);
var max = datelist.Aggregate(
new { curCount = 0, max = 0 },
(result,item) => {
if (item.t == "open")
{
if (result.max < (result.curCount+1))
return(new { curCount = result.curCount+1, max = result.curCount+1 });
else
return(new { curCount = result.curCount+1, max = result.max });
}
else
return(new { curCount = result.curCount-1, max = result.max });
},
result => result.max);
max.Dump();
}
// Define other methods and classes here
public class Event
{
public DateTime open { get; set; }
public DateTime close { get; set; }
public Event(DateTime inOpen, DateTime inClose)
{
if (inOpen <= inClose)
{
open = inOpen;
close = inClose;
}
else throw(new Exception("Can't close at "+inClose.ToShortDateString()+" before you open at "+inOpen.ToShortDateString()));
}
}
'events.Select(I => events.Where(J => i.DateOpen <= j.DateClose && i.DateClose> = j.DateOpen).Count之間())。MAX()'(我現在不編程C#,所以可能會錯過一些東西) – zerkms
@zerkms:這可能會起作用。它是O(n^2),但對於這個應用程序來說可能很好。 – Gabe
@加貝:我正在考慮一些樹結構,但並沒有將它們應用於有限的時間間隔。 – zerkms