2

我有两个以纳秒为单位的时间列表。每个列表可以有 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() );
      }
    }
  }
}
4

2 回答 2

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;
    }
  }
于 2013-04-05T21:03:40.340 回答
0

如果列表已排序,那么您肯定可以使用二进制搜索来查找“窗口”位置吗?

于 2013-04-05T21:23:02.903 回答