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

What is an efficient algorithm to compare two large lists of data in C++?

本文关键字:列表 数据 有效 算法 是什么 两个 比较 c++      更新时间:2023-10-16

我有两个以纳秒为单位的时间列表。每个列表可以有10^12个或更多的元素。我目前的实现是取两个列表的一个子集,比较该子集中使用for循环的时间和输出相关时间,然后取另一个子集。对于每个子集比较,运行时间大约为。(m*n),其中m为list 1子集的大小,n为list 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: %dn, list2[j].time() - list[1].time() );
      }
    }
  }
}

如果您的两个列表按时间排序,则可以有效地遍历列表:

  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: %dn, list2[k].time() - list1[i].time() );
      ++k;
    }
  }

如果列表是排序的,那么您肯定可以使用二进制搜索来找到"窗口"位置?