在C ++中比较两个大型数据列表的有效算法是什么?

时间:2013-04-05 20:48:58

标签: c++ algorithm search compare

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

2 个答案:

答案 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)

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