这是一个相当抽象的问题,因为我还不知道如何解决它,并没有找到任何合适的解决方案。抽象算法:字符串/字节比较/比较
让我们从当前的情况开始。你会得到一组byte[]
(例如ArrayList<byte[]>
),幕后实际上是字符串,但在当前状态byte[]
是首选。它们可能非常长(每个byte[]
阵列的1024+字节,而ArrayList
可能包含多达1024个byte[]
阵列),并且可能具有不同的长度。此外,它们在“相同”位置共享很多相同的字节(这是相对的,a = {0x41,0x41,0x61},b = {0x41,0x41,0x42,0x61} =>其中第一个0x41和最后的0x61是相同的)。
我正在寻找一种算法,将所有这些数组相互比较。结果应该是最不相同的数组以及它们相互之间的差异程度(某种度量标准)。此外,该任务应在短时间内完成。
如果可能,不使用任何第三方库(但我怀疑这是可行的在没有一个合理的时间)。
任何建议都非常欢迎。
编辑:
做了一些调整。
编辑/解决方案:
我使用的是莱文斯坦距离现在。此外,我做了一些微调,以提高运行时间/速度。这对我处理的数据非常具体,因为我知道所有的字符串都有很多共同点(我大概知道它在哪里)。因此,与Levenshtein距离算法直接使用的两个未过滤字符串(测试数据)相比,过滤该内容可将速度提高400倍。
感谢您的输入/答复,他们是一个很好的帮助。
不清楚。 “你将有一个byte []”=> 1数组的数组。 “它们可以很长(每个〜1024个字节)”=>至少2个数组。那里有多少?无论如何,答案可能都是对所有Levenshtein距离;去谷歌上查询。 –
@j_random_hacker - 谢谢你的回答。我已经在研究Levenshtein距离,但是读到它对长字符串表现不佳(这可能是这种情况?没有找到确切长度的定义)。此外,你比较2个字符串,而不是一堆字符串,这让我想知道你需要比较哪些字符串(你没有“基线”)。关于“不清晰”的部分:我调整了这个问题,它是一个ArrayList而ArrayList的大小高达1024,每个byte []数组的大小是1024 - 未定义(非常长...> _ < ) –
由于您必须处理1024和* undefined *之间的某个大小,因此Array是一个非常糟糕的选择。如果可能的话,你应该使用一些可以无限增长的结构,例如您选择的“List”实施。 即使Levenshtein距离如果计算起来昂贵,它似乎也是这里的相关度量。将所有数组与所有数组进行比较,也将具有O(n2)的运行时特性,其可靠性不会很快*。 – nitowa