抽象算法:字符串/字节比较/差异

时间:2016-04-14 11:29:53

标签: java arrays algorithm compare diff

这是一个相当抽象的问题,因为我还不知道如何解决它并且没有找到任何合适的解决方案。

让我们从目前的情况开始。您将拥有一个byte[]数组(例如ArrayList<byte[]>),其后面的场景实际上是字符串,但在当前状态下,byte[]是首选。它们可能很长(每个byte[]数组1024个字节,而ArrayList最多可包含1024个byte[]数组),并且可能具有不同的长度。此外,它们在“相同”位置共享许多相同的字节(这是相对的,a = {0x41,0x41,0x61},b = {0x41,0x41,0x42,0x61} =&gt;其中第一个0x41和最后的0x61是相同的。)

我现在正在寻找一种算法,将所有这些数组相互比较。结果应该是最大的数组和彼此不同的数组(某种度量标准)。此外,任务应在短时间内完成。

如果可能的话,不使用任何第三方库(但我怀疑在合理的时间内没有第三方库是可行的。)

非常欢迎任何建议。

修改

做了一些调整。

编辑/解决方案:

我现在正在使用Levenshtein距离。此外,我做了一些小的调整,以提高运行时间/速度。这对我正在处理的数据非常具体,因为我知道所有字符串都有很多共同之处(我知道在哪里)。因此,与Levenshtein距离算法直接使用的两个未经过滤的字符串(测试数据)相比,过滤该内容可将速度提高400倍。

感谢您的意见/答案,他们是一个很好的帮助。

2 个答案:

答案 0 :(得分:1)

  

结果应该是最大的数组和彼此不同的数组(某种度量标准)。此外,任务应在短时间内完成。

您将无法找到指标和时间独立的解决方案,它们是齐头并进的。

例如:如果您的指标与帖子中的示例类似,即d(str1,str2) = d(str1.first,str2.first) + d(str1.last,str2.last),那么解决方案非常简单:按照第一个和最后一个字符(可能是单独的)对数组进行排序,然后选择第一个和排序数组的最后一个元素。这将为您提供O(n logn)排序。

但是,如果您的指标类似于“如果两个句子包含许多相同的单词,那么这两个句子很接近”,那么这根本不起作用,最终会得到O(n²)在排序句子等之前,您可能会想出一种在句子中重新排序单词的好方法。

因此,除非你有一个已知的指标,否则O(n²)具有比较所有内容的简单(天真)实现,同时跟踪最大增量。

答案 1 :(得分:0)

我现在正在使用Levenshtein距离。此外,我做了一些微调,以提高运行时间/速度。这非常特定于我处理的数据,因为我知道所有字符串都有很多共同之处(我知道大概在哪里)。因此,与Levenshtein距离算法直接使用的两个未经过滤的字符串(测试数据)相比,过滤该内容可将速度提高400倍。

感谢您的意见/答案,他们是一个很好的帮助。