gpt4 book ai didi

c++ - 对两个大文件中的子事件对进行计算

转载 作者:行者123 更新时间:2023-11-28 08:17:41 24 4
gpt4 key购买 nike

我在两个文件中有大量数据,每个文件都有大约两百万(不同)条目。该文件的结构是这样的,有一个事件编号,每个事件都有一些子事件。这些子事件中的每一个都具有一些特征。例如,文件的一般结构是这样的:

Index  Event     SubEvent      Characteristic1          Characteristic2 .... 
1 1 1 322 234
2 1 2 453 324
3 1 3 ... ...
. . . ... ...
. . . ... ...
100 1 100 ... ...
101 2 1 ... ...
102 2 2 ... ...
. . . ... ...
. . . ... ...
. . . ... ...
207 2 107 ... ...
208 3 1 ... ...
209 3 2 ... ...

以此类推,索引一直到两百万左右。

我有两个文件,我们称它们为 file1file2,具有上述结构。我必须使用它们的特性对事件的每个子事件进行一些计算。这是我所想的概要。

LOOP over each INDEX in file1
LOOP over each INDEX in file2
if (Event value of file1 is same as event value of file2)
/* do some computations with characteristics and store them somewhere*/

目前我写的实现

for (int i=0;i<nEntries_1;i++)  {
file1->GetEntry(i);
for (int_t j=0; j < nEntries_2 ; j++) {
file2->GetEntry(j);
if (event1 != event2) break;
else {
/* Doing the computation with characteristics*/
}
}
}

但是我认为这是错误的。假设我们在顶部 file1 循环中的索引 209 处。这意味着它需要为 file1 的事件 3 中的子事件 2 和 file2 中的事件 3 的所有子事件计算一些特征。但是,上面的代码会跳出循环,因为第一个条目的事件编号不匹配。

什么是可能的解决方案。如果我只是在没有 if-break 命令的情况下进行暴力破解,则需要很长时间。

最佳答案

在你的循环中你必须说 continue 来跳过一个回合,而不是你的 break 来中止整个循环。

在设计方面,您的算法效率极低,因为您可以通过进行基本的复杂性分析来说服自己。几乎肯定有必要为您的数据建立适当的索引。

这正是数据库的用途。我建议您安装一个小型数据库(例如 MySQL),制作两个表并对数据运行 JOIN 查询,这应该比您的手动循环效率高很多

或者,如果您想自己尝试一下,您可以使用类似 std::multimap 的结构在 C++ 中构建自己的微型数据库,然后使用 euqal_range() 做定向匹配。

关于c++ - 对两个大文件中的子事件对进行计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7141427/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com