2010-12-14 68 views
2

我有一個包含10個鍵的字典,每個鍵都有一個包含多達30,000個值的列表。這些值包含一個DateTime屬性。通過DateTime收集搜索的最快方法

我經常需要提取其中一個鍵的小子集,例如30-60秒的日期範圍。

這樣做很容易,但讓它快速運行並非如此。什麼是查詢這些內存數據的最有效方式?

非常感謝。

回答

2

按日期排序名單在第一,然後找到二進制搜索(即ķ項目)您需要的項目,並返回它們,找到搜索到的產品爲O(log(n))的,因爲你需要找到第一個和最後一個索引。在所有的返回他們爲O(K)這是O(K +的log(n))

IEnumerable<item> GetItems(int startIndex, int endIndex, List<item> input) 
    { 
     for (int i=startIndex;i<endIndex;i++) 
      yield return input[i]; 
    } 
2

1)保持字典,而是使用SortedList而不是列表的字典值,日期時間屬性排序

2)實現二進制搜索找到你的範圍內上下邊緣排序列表它給你索引。

3)使用Sortedlist.Values.Skip(lowerIndex).Take(upperIndex - lowerIndex)

+0

跳過(lowerIndex)是不好的方式它需要O(n) – 2010-12-14 12:11:21

0

的最快方法的範圍內只要選擇的值會因此它是由你要搜索的東西索引來組織數據。目前您已將其按鍵索引,但您希望按日期進行搜索。我認爲你最好按日期編制索引,如果這是你想要搜索的內容。

我會保持2本字典,一個因爲你現在做索引,一個地方的項目按日期索引。我會決定一個時間範圍(比如說1分鐘),然後根據發生的時間將每個對象添加到列表中,然後將每個列表添加到該分鐘下的字典下。那麼當你想要一個特定的時間框架的數據,生成相關的分鐘並從字典中獲取列表。這依賴於你能夠從對象中知道另一個字典中的關鍵字。

0

在回答Aliostad:我不認爲bsearch將無法正常工作,如果收集的名單是一個鏈表。它仍然需要O(n)