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

Abstract Algorithm: String / Byte Comparison / Diff

这是一个比较抽象的问题,我还不知道如何解决,也没有找到合适的解决方案。

先从现在的情况说起吧。您将拥有一个 byte[] 数组(例如 ArrayList<byte[]>),在幕后实际上是字符串,但在当前状态下 byte[] 是首选。它们可以很长(每个 byte[] 数组超过 1024 个字节,而 ArrayList 可能包含多达 1024 个 byte[] 数组)并且可能具有不同的长度。此外,它们在 "same" 位置共享很多相同的字节(这是相对的,a = {0x41, 0x41, 0x61}, b = {0x41, 0x41, 0x42, 0x61} => 第一个 0x41和最后的 0x61 相同)。

我现在正在寻找一种可以将所有这些数组相互比较的算法。结果应该是差异最大的数组以及它们彼此之间的差异(某种度量)。此外,任务应该会在短时间内完成。

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

非常欢迎任何建议。

编辑:

做了一些调整。

编辑/解决方案:

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

感谢您的输入/回答,他们提供了很大的帮助。

The result should be the array that differs the most and how much they differ from each other (some kind of metric). Furthermore, the task should complete within a short time.

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

例如:如果您的指标类似于 post 中的示例,即 d(str1,str2) = d(str1.first,str2.first) + d(str1.last,str2.last),那么解决方案非常简单:按第一个和最后一个字符对数组进行排序(可能分开) ,然后取排序数组的第一个和最后一个元素。这会给你 O(n logn) 排序。

但是如果您的指标类似于 "two sentences are close if they contain many equal words",那么这根本不起作用,您最终会得到 O(n²)或者在对句子等进行排序之前,您也许可以想出一个巧妙的方法来重新排列句子中的单词。

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

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

感谢您的输入/回答,他们提供了很大的帮助。