在 C++ 中比较两个大型数据列表的有效算法是啥?
Posted
技术标签:
【中文标题】在 C++ 中比较两个大型数据列表的有效算法是啥?【英文标题】: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 之类的东西并存储在外部驱动器上? 【参考方案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以上是关于在 C++ 中比较两个大型数据列表的有效算法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
(预)处理存储在 json 中的大型数据集的最有效方法是啥?