【问题标题】:What is an efficient algorithm to compare two large lists of data in C++?在 C++ 中比较两个大型数据列表的有效算法是什么?
【发布时间】:2013-04-05 20:48:57
【问题描述】:

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

【问题讨论】:

  • 比较基于什么标准?您的示例代码中只有这个?
  • 似乎需要对这两个列表进行排序以提高效率。
  • 是的,我只是比较上面代码示例中的内容。
  • @ddriver 预增量?真的吗? 来吧...
  • 最多 10^12 个元素或更多...由于时间以纳秒为单位,我假设您至少需要 64 位数据类型来存储它们。你真的拥有 16TB 的 RAM 来存储它吗?还是您的列表数据结构来自 STXXL 之类的东西并存储在外部驱动器上?

标签: c++ algorithm search compare


【解决方案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;
    }
  }

【讨论】:

  • 由于这些应该是时间戳输入,我认为顺序很重要。
  • @ddriver:是的,事实上它们可能已经按时间排序了。
  • 但前提是它们是实际时间戳而不是时间戳之间的间隔。后一种情况排序是不切实际的,因为你不知道什么是什么。
  • @ddriver:OP 的 cmets 已澄清它们是时间列表而不是间隔。
  • 我会试试这个实现,看看它是否能缩短我的时间。我很抱歉没有很好地澄清我的问题中时间的含义,时间是以纳秒为单位的时间戳。在这个版本中,我仍然需要处理翻转,但它可能足够快,我可以在翻转之间执行部分时间。
【解决方案2】:

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

【讨论】:

  • 我曾考虑过使用二叉搜索树,但我不熟悉任何可以让我快速使用已经实现的库。
  • @Cerekay:我在想std::binary_search
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-24
  • 1970-01-01
  • 2011-04-10
相关资源
最近更新 更多