這是一個相當抽象的問題,因爲我還不知道如何解決它,並沒有找到任何合適的解決方案。抽象算法:字符串/字節比較/比較
讓我們從當前的情況開始。你會得到一組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