我有两个以纳秒为单位的时间列表。每个列表可以包含10 ^ 12个元素或更多元素。我目前的实现是获取两个列表的子集,使用for循环和输出相关时间比较该子集中的时间,然后采用另一个子集。对于每个子集比较,这大约在(m * n)其中m是列表1子集的大小,n是列表2子集的大小,这显然是一个不好的算法。
我的时钟也小于数据集的总时间,所以在某些时候数据中存在翻转。
列表1包含某些事件,列表2包含次要事件。我想知道次要事件是否在主要事件的某个时间内发生。还有很多噪音,所以我需要创建一个相关时间的直方图,并寻找有统计显着信号的时间。
我想知道是否有一个已知的高效算法可以在任何开源库中使用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 :(得分: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;
}
}
答案 1 :(得分:0)
如果列表已排序,您肯定可以使用二进制搜索来查找“窗口”位置吗?