gpt4 book ai didi

比较大型校验和列表的 Java 效率

转载 作者:搜寻专家 更新时间:2023-11-01 03:37:32 25 4
gpt4 key购买 nike

我正在尝试比较两个目录,每个目录都有大约 15k 个文件,以了解是否有任何更改。 A 是较新的版本,B 必须更新到它。

我有两个大的校验和列表文件,称之为 A 和 B。A 是新版本,B 是旧版本。每个都有大约 15k 个条目,看起来有点像下面这样:

<entry1 -filepath> <entry1 -checksum>
<entry2 -filepath> <entry2 -checksum>
<entry3 -filepath> <entry3 -checksum>
. .
. .
. .

条目按字母顺序列出。需要比较这两个文件以检查以下内容:

1. 两个条目具有相同的文件路径但不同的校验和。
2. 一个条目在文件A中存在,但在文件B中不存在。
3. 文件B中存在条目,但文件A中不存在。

我的建议算法:

int currentBLine = -1;

for(int index = 0; index < A.length; index++)
{
String newfilepath = A[index].getFilePath();
String newchecksum = A[index].getCheckSum();

for(; currentBLine < B.length; currentBLine++)
{
String oldfilepath = B[currentBLine].getFilePath();
String oldchecksum = B[currentBLine].getCheckSum();

if(filepath.compareTo(oldfilepath) > 0)
{
deleteFile(oldfilepath);
}
else if(filepath.compareTo(oldfilepath) == 0)
{
if(checksum.equals(oldchecksum)
{
currentBLine++;
break;
}
else
{
updateFile(oldfilepath, newfilepath);
break;
}
}
else
{
createFile(newfilepath);
break;
}
}
}

这是最有效的方法吗?我在这里做错了什么吗?

如果有人看到 XY 问题,请告诉我,我会填写背景。

最佳答案

您的程序(内部循环中带有 break 的两个嵌套循环)实现了同时处理两个已排序集合的标准算法。它类似于您在 merging two sorted lists 时使用的那个: 创建两个索引,每个列表一个,循环直到两个列表都到达末尾。

您可以通过将其设为单个循环而不是使用两个嵌套循环来使其恢复经典形式。在循环的每个步骤中,您执行的比较类似于您在三向 if 语句中所做的比较。唯一的区别是您不会使用 break,并且您需要检查 AB 中的索引以使其在它们的范围内限制。如果两个索引都在 AB 限制内,请比较文件并按照您编码的方式检查总和。如果您到达了 A 的末尾,请删除 B 文件。如果您到达了 B 的末尾,请复制 A 文件。两个列表都用完后,循环结束。

关于比较大型校验和列表的 Java 效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26198564/

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