2013-06-18 44 views
1

我在尋找從大型集合中提取對象的最佳方法,它們的位置來自兩個排序的參數。如何根據多個參數在容器中查找對象的範圍

例子:

struct Object{ 
    Time start; 
    Time end; 
    //... data 
}; 

現在,任何時候t我想迅速找到所有對象「存在」這段時間內,即t是對象的startend值之間。

我想到的方法是使用:

std::multimap<Time, object*> objectsOrderedByStart; 
std::multimap<Time, object*> objectsOrderedByEnd; 

multimap因爲可能有很多對象具有相同Time值,這是分類鍵)

每次我創建Object我將它添加到每個multimap,它會自動將對象放置在startend的排序列表中。

然後我在那裏objectsOrderedByStartt>Time對象objectsOrderedByEnd其中t<End尋找所有對象,然後只服用那些在這兩個結果集「查詢」我的時間t有效對象。但是這看起來效率低下,我能想到的找到聯合的唯一方法是逐個查看一個結果集並查看該對象是否在另一個結果集中。

但是我懷疑這不是最有效的方法。當迭代每個multimap而不是逐個迭代時,我可以通過跳過元素來進行迭代,然後如果我太過分並從最後一個跳過點一個接一個地迭代,則會退回。或者,我可以保留一個multimap,然後在每個object內部對等以查看它的end時間。

但我懷疑有更好的方法來組織這些數據並找到那些對我感興趣的範圍?

+0

@ n.m。我很好奇,你是怎麼找到這個問題的?它不是出現的「相關」問題之一,搜索並沒有爲我提供幫助。當然,這個問題不是C++特有的,或者沒有被標記,因此也許是問題的一部分。 – johnbakers

+0

這是一個衆所周知的問題和相關的谷歌搜索(*時間間隔搜索*,我認爲)帶來了其他問題相當高的結果。 –

+0

@ n.m。到目前爲止,我最能夠圍繞我的頭的方法是增強間隔樹http://en.wikipedia.org/wiki/Interval_tree – johnbakers

回答

0

您可以使用兩個手動排序的數組而不是兩個multimaps,然後使用std::lower_boundstd::upper_bound或手動編碼的二進制搜索來搜索它們。

+0

我認爲自定義bsp是要走的路,特別是增強間隔樹在這裏似乎是一個不錯的選擇 – johnbakers