Java 大比较任务的估计

Java 大比较任务的估计,java,io,comparison,cpu-usage,virtual-memory,Java,Io,Comparison,Cpu Usage,Virtual Memory,我有一项来自大学的编程任务,需要通过逐字节比较数百个文件(好文件和坏文件,小于1兆字节)来查找恒定长度的共享字符串 假设我要做一个全面的比较,并且我将每个文件与其他文件进行比较,有可能在几分钟内完成这个任务吗 我已经尝试过这个朴素的算法,几天来我一直在改进它,而且我似乎不能在几个小时内就放弃 到目前为止我所做的: 中央处理器: 我在本地测试了不同的比较和缓冲区大小,以确定哪种最适合我的需要 我不保留签名本身,只保留对它的引用(通过一个与文件大小相同的布尔数组-也有助于我不再比较已排除的索引) 我

我有一项来自大学的编程任务,需要通过逐字节比较数百个文件(好文件和坏文件,小于1兆字节)来查找恒定长度的共享字符串

假设我要做一个全面的比较,并且我将每个文件与其他文件进行比较,有可能在几分钟内完成这个任务吗

我已经尝试过这个朴素的算法,几天来我一直在改进它,而且我似乎不能在几个小时内就放弃

到目前为止我所做的:

中央处理器: 我在本地测试了不同的比较和缓冲区大小,以确定哪种最适合我的需要

我不保留签名本身,只保留对它的引用(通过一个与文件大小相同的布尔数组-也有助于我不再比较已排除的索引)

我目前正在将可调用比较任务安装到系统中,希望它不会产生太多开销或同步问题

虚拟内存: 我根据可用的可用内存来确定缓冲区大小(
System.freemory()
-手动指定后大约2GB),以防止抖动,并且我已经决定在每个文件保存的信息之间进行合理的(依我看)权衡

算法: 在对文件结构进行静态分析之后,我尝试只比较可疑位置的字节子集(JAR文件,我没有研究字节码,因为我不知道如何从字节码推断相关性,我只比较“classes.dex”)


考虑到这一定是一项共同的任务,我是否遗漏了一些非常明显的东西?我被告知对签名进行散列可以更快,但我怀疑这比等待比较结束并稍后通过引用存储它们要快(一旦比较本身(即瓶颈)结束,这会非常快)。对我来说,哈希似乎是一个巨大的虚拟机占用风险

它被告知应该在“合理的时间”内运行,目标是找到文件(或接近文件)中最好(最小)的超集(包括大多数坏文件和没有好文件)。在我看来,在听到一些人声称已经完成了这项工作之后,我已经走了很远

如果需要更多信息,请询问,我会将其编辑到帖子中



我计划使用一个Trie的实现,万一我忘了更新这个,我希望你谁遇到这个可以利用它(或在这个项目中的其他人)为你的需要

如果您想覆盖所有字符串,您需要的是
trie
。它是一个树,其中每个节点都是一个字符串的字节。最后一个节点将报告字符串出现的次数

如果你有“Dog”、“Dad”、“Dod”、“Dog”,你的结尾是

 D
 | -------
 |       |
 a       o-------
 |       |      |
 |       |      |
 d(1)    d(1)   g(2)

由于字符串具有固定长度
n
,因此每个级别i最多有256^i个节点,因此总数将为256^0+256^1+…+256^n(这是一个上限)节点。

如果要覆盖所有字符串,您需要的是一个
trie
。它是一个树,其中每个节点都是一个字符串的字节。最后一个节点将报告字符串出现的次数

如果你有“Dog”、“Dad”、“Dod”、“Dog”,你的结尾是

 D
 | -------
 |       |
 a       o-------
 |       |      |
 |       |      |
 d(1)    d(1)   g(2)

由于字符串具有固定长度
n
,因此每个级别i最多有256^i个节点,因此总数将为256^0+256^1+…+256^n(这是一个上限)节点。

不知道我是否正确,但如何从每个文件中逐个提取相关字符串,并将其放入一些数据库索引,如
[string]|[file]
。之后,您可以在数据库中使用不同的字符串并找到列出的所有相关文件?这将在一个小的内存占用,你不会运行在组合爆炸?我有数据库集成,但运行时间是我的主要关注点。Trie的想法非常有趣,似乎是正确的方法。我很快会测试它。我不知道我是否正确,但是如何从每个文件中逐个提取相关字符串,并将其放入一些数据库索引中,如
[string]|[file]
。之后,您可以在数据库中使用不同的字符串并找到列出的所有相关文件?这将在一个小的内存占用,你不会运行在组合爆炸?我有数据库集成,但运行时间是我的主要关注点。Trie的想法非常有趣,似乎是正确的方法。我很快会测试的。非常有趣!让我想起了我忘记的Lempel-Ziv编码!我会调查一下,然后试着编一个解决方案。你们在这方面不是太学术了吗?还是我遗漏了什么?这是搜索引擎常见的问题。谷歌也不是“搜索可能的术语”,而是为所有相关术语编制索引,然后再搜索。将搜索算法留给数据库中唯一的索引键列,它将完成其工作。在上面的例子中,所有的数学都是无关的,因为有两(2)个术语:狗和爸爸。它们获得一个唯一的索引,并在第二个关系中列出所有事件(文件名)。要用dog“查找”所有文件,需要几微秒的时间,并从数据库引擎发出一声叹息……,我正在搜索字节条纹,所以我不确定您的建议如何解决问题。它们一点意义都没有,Trie的建议是正确的方法。@AxelAmthor你错过了很多东西。1) 谷歌需要存储这些条款,OP没有。此外,OP不想知道有多少文件具有字符串
x
(您可以使用
grep
),请仔细阅读要求。2) 一个好的内存结构要比DBs快得多(没有HD访问,速度很慢)。而这正是OP所需要的。3) 在开始实现算法之前,必须了解算法的行为(包括内存需求和计算时间),否则会损失很多