我在尋找從大型集合中提取對象的最佳方法,它們的位置來自兩個排序的參數。如何根據多個參數在容器中查找對象的範圍
例子:
struct Object{
Time start;
Time end;
//... data
};
現在,任何時候t
我想迅速找到所有對象「存在」這段時間內,即t
是對象的start
和end
值之間。
我想到的方法是使用:
std::multimap<Time, object*> objectsOrderedByStart;
std::multimap<Time, object*> objectsOrderedByEnd;
(multimap
因爲可能有很多對象具有相同Time
值,這是分類鍵)
每次我創建Object
我將它添加到每個multimap
,它會自動將對象放置在start
和end
的排序列表中。
然後我在那裏objectsOrderedByStart
和t>Time
對象objectsOrderedByEnd
其中t<End
尋找所有對象,然後只服用那些在這兩個結果集「查詢」我的時間t
有效對象。但是這看起來效率低下,我能想到的找到聯合的唯一方法是逐個查看一個結果集並查看該對象是否在另一個結果集中。
但是我懷疑這不是最有效的方法。當迭代每個multimap
而不是逐個迭代時,我可以通過跳過元素來進行迭代,然後如果我太過分並從最後一個跳過點一個接一個地迭代,則會退回。或者,我可以保留一個multimap
,然後在每個object
內部對等以查看它的end
時間。
但我懷疑有更好的方法來組織這些數據並找到那些對我感興趣的範圍?
@ n.m。我很好奇,你是怎麼找到這個問題的?它不是出現的「相關」問題之一,搜索並沒有爲我提供幫助。當然,這個問題不是C++特有的,或者沒有被標記,因此也許是問題的一部分。 – johnbakers
這是一個衆所周知的問題和相關的谷歌搜索(*時間間隔搜索*,我認爲)帶來了其他問題相當高的結果。 –
@ n.m。到目前爲止,我最能夠圍繞我的頭的方法是增強間隔樹http://en.wikipedia.org/wiki/Interval_tree – johnbakers