【发布时间】: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