2013-04-05 49 views
2

我有兩個時間列表(納秒)。每個列表可以有10^12個元素或更多。我目前的實現是獲取這兩個列表的一個子集,使用for循環比較該子集中的時間並輸出相關時間,然後獲取另一個子集。對於每個子集的比較,這個運行時間約爲(m * n)其中m是列表1子集的大小,n是列表2子集的大小,這顯然是一個不好的算法。在C++中比較兩個大型數據列表的有效算法是什麼?

我也有一個時鐘比我的數據集的總時間更小,所以有數據翻車要在特定的時間與相關。

表1有一定的活動,並列表中有兩個具有次要事件。我想知道次要事件是否在主要事件發生的特定時間內發生。還有很多噪音,所以我需要創建一個相關時間的直方圖,並尋找有統計意義的信號的時間。

我想知道是否有一個已知的高效算法,可以在C++使用任何開源庫,或者說我可以實現,同時搜索列表的時間的高效算法,輸出的項落在窗口內。

這裏是蠻力函數的例子:

int correlate_lists(int window) 
{ 
    for(int i = 0 ; i < list1.size() ; i++) 
    { 
    for(int j = 0 ; j < list2.size() ; j++) 
    { 
     if(list2[j].time() > list1[i].time() && (list2[j].time() - list1[j].time()) < window) 
     { 
     printf("Time: %d\n, list2[j].time() - list[1].time()); 
     } 
    } 
    } 
} 
+0

比較基於什麼標準呢?在你的示例代碼中只有這個? – dtech 2013-04-05 20:50:04

+4

似乎需要對兩個列表進行排序才能使其效率更高。 – 2013-04-05 20:51:27

+0

是的,我只比較代碼示例中的以上內容。 – Derek 2013-04-05 20:54:43

回答

1

如果兩個列表按時間排序,您可以通過列表有效地走路:

for(int i = 0, j = 0 ; i < list1.size() ; ++i) 
    { 
    while(j < list2.size() && list2[j].time() <= list1[i].time()) 
    { 
     ++j; 
    } 

    int k = j; 

    while(k < list2.size() && list2[k].time() < list1[i].time() + window) 
    { 
     printf("Time: %d\n, list2[k].time() - list1[i].time()); 
     ++k; 
    } 
    } 
+0

由於這些都是時間戳輸入,我認爲這個順序很重要。 – dtech 2013-04-05 21:08:56

+0

@ddriver:是的,實際上它們可能已經按時間排序了。 – 2013-04-05 21:10:23

+0

但是隻有它們是實際的時間戳而不是時間戳之間的時間間隔。後一種情況下,排序是不切實際的,因爲你不知道是什麼。 – dtech 2013-04-05 21:11:40

0

如果列表進行排序,當然你可以使用二進制搜索來查找「窗口」的位置?

+0

我已經考慮了二叉搜索樹,但我不熟悉任何允許我快速使用已經實現的庫的庫。 – Derek 2013-04-05 22:00:15

+0

@Cerekay:我在考慮[std :: binary_search](http://www.cplusplus.com/reference/algorithm/binary_search/) – 2013-04-05 22:21:40