这是一个相当抽象的问题,因为我还不知道如何解决它并且没有找到任何合适的解决方案。
让我们从目前的情况开始。您将拥有一个byte[]
数组(例如ArrayList<byte[]>
),其后面的场景实际上是字符串,但在当前状态下,byte[]
是首选。它们可能很长(每个byte[]
数组1024个字节,而ArrayList
最多可包含1024个byte[]
数组),并且可能具有不同的长度。此外,它们在“相同”位置共享许多相同的字节(这是相对的,a = {0x41,0x41,0x61},b = {0x41,0x41,0x42,0x61} =&gt;其中第一个0x41和最后的0x61是相同的。)
我现在正在寻找一种算法,将所有这些数组相互比较。结果应该是最大的数组和彼此不同的数组(某种度量标准)。此外,任务应在短时间内完成。
如果可能的话,不使用任何第三方库(但我怀疑在合理的时间内没有第三方库是可行的。)
非常欢迎任何建议。
修改
做了一些调整。
编辑/解决方案:
我现在正在使用Levenshtein距离。此外,我做了一些小的调整,以提高运行时间/速度。这对我正在处理的数据非常具体,因为我知道所有字符串都有很多共同之处(我知道在哪里)。因此,与Levenshtein距离算法直接使用的两个未经过滤的字符串(测试数据)相比,过滤该内容可将速度提高400倍。
感谢您的意见/答案,他们是一个很好的帮助。
答案 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倍。
感谢您的意见/答案,他们是一个很好的帮助。