2008-08-18 95 views
2

我想要一個數據結構,它將允許查詢最近有多少項X分鐘。一個項目可能只是一個簡單的標識符或更復雜的數據結構,最好項目的時間戳將在項目中,而不是存儲在外部(作爲散列或類似項目,不希望多個項目具有相同的問題時間戳)。C#中的老化數據結構

到目前爲止,似乎用LINQ我可以很容易地過濾時間戳大於給定時間的項目,並聚合一個計數。儘管我仍然猶豫是否嘗試將.NET 3.5特定的東西加入到我的生產環境中。對於類似的數據結構還有其他建議嗎?

我感興趣的其他部分是老化舊數據輸出,如果我只是要求少於6小時前的項目數,我希望任何比這更老的東西要從中刪除我的數據結構,因爲這可能是一個長期運行的程序。

回答

3

一個簡單的鏈表可以用於此。

基本上,你添加新的項目到最後,並從開始刪除過舊的項目,這是一個便宜的數據結構。

例如代碼:

list.push_end(new_data) 
while list.head.age >= age_limit: 
    list.pop_head() 

如果該列表將是夠忙的,以保證在一個時間斬去大塊不止一個,那麼我dmo同意,採用樹狀結構或類似的東西,使修剪在更高的水平上。

2

我認爲一個重要的考慮因素是查詢與添加/刪除的頻率。如果你會做頻繁的查詢(特別是如果你有一個大的集合)B樹可能是要走的路:

http://en.wikipedia.org/wiki/B-tree

你可以有一些線經過,並定期清理這棵樹或者使其成爲搜索的一部分(再次,取決於使用情況)。基本上,您將執行樹搜索以在「x分鐘前」找到該點,然後使用較新的時間計算節點上的子節點數。如果您將節點下的孩子數量保持在最新狀態,則可以快速完成此項工作。