2010-07-16 125 views
2

我正在做大量數據的字符串匹配。Java中的字符串搜索算法

編輯:我用一些本體文本文件匹配包含在一個大列表中的單詞。我從本體中獲取每個文件,並搜索每個文件行的第三個字符串與列表中的任何單詞之間的匹配。

我在監督我需要做的不是純匹配(結果很差)這一事實上犯了一個錯誤,但我需要一些寬鬆的匹配函數,當字符串被包含在另一個字符串中時也會返回結果。

我這樣做了一個Radix Trie;它速度非常快,並且工作得很好,但是現在我想我的工作是無用的,因爲一個trie只返回完全匹配。 :/

  • 這樣做的算法的類型是字符串搜索算法?
  • 有人可以推薦一些他有經驗的Java實現嗎?

該算法應該是快速的,但不是最高優先級,會與速度複雜化。

我非常感謝所有的建議/例子/解釋/鏈接!

謝謝!

+0

什麼是「執行此操作的算法類型是字符串搜索算法?」問? – Svante 2010-07-16 22:10:04

回答

3

您可能會發現Suffix Trees有用(它們在概念上與Tries類似)。

每個字符串,你用^加上,並以$結尾,並創建一個後綴樹,其中包含所有字符串。空間的使用將是O(n),並且可能會比您爲這個trie所做的更糟糕。

如果你現在需要搜索一個字符串s,你可以很容易地在O(| s |)時間做,就像一個trie,你得到的匹配將是一個子字符串匹配(基本上,你會匹配一些一些字符串的後綴)。

對不起,我沒有一個方便的Java實現的引用。

找到一個有用的計算器答案:Generalized Suffix Tree Java Implementation

其中有: http://illya-keeplearning.blogspot.com/2009/04/suffix-trees-java-ukkonens-algorithm.html

這反過來:源代碼:http://illya.yolasite.com/resources/suffix-tree.zip

+0

@Moron:我想這可能正是我所需要的,如果我理解得很好,我可以用同一棵樹做「匹配」和「包含」? – Julia 2010-07-16 21:58:34

+0

@Julia:是的。如果您想要完全匹配,請在^之前加上搜索字符串並附加$並進行匹配。如果您想包含,請按原樣使用搜索字符串。 – 2010-07-16 21:59:51

+0

@Moron:似乎這將是完美的。必須有一些Java庫! – Julia 2010-07-16 23:21:06

1

正則表達式是絕對是你最好的選擇。編寫它們可能會有點混亂,但它們是唯一可以鬆散匹配的方式,而不會產生難以理解的一系列if/else或switch語句。

另外,它們會比替代品快很多。

+0

我修改了我的解釋,我沒有解釋清楚對不起! – Julia 2010-07-16 21:45:17

+0

-1:爲什麼正則表達式是'最好的'?爲什麼選擇if/else switch語句?在聲稱替代品較慢之前,您考慮過哪些其他替代方案?我會說正則表達式的表現會很糟糕!你必須編譯它們,然後在匹配等過程中可能回溯... – 2010-07-16 21:56:54

+0

好吧,問題原來措辭的方式(預編輯),這是我閱讀它的方式 - 顯然,它不再適用! – chimeracoder 2010-07-19 14:08:54

1

您可以使用BM algorithm在文本文件中搜索單一模式,並對列表中的所有模式重複此算法。

其他最好的解決方案是使用多模式搜索算法,如:你爲什麼不Java中使用indexOf方法Aho–Corasick string matching algorithm

+0

http://johannburkard.de/software/stringsearch/? 你說在文本文件中搜索,但我不需要匹配文本文件中的任何地方,但每行的每一個字符串,可以指定? (抱歉的細節,我很害怕衝入像我用基數特里這樣的事情) – Julia 2010-07-16 23:19:36

+0

BM算法匹配任何字符串而不關心字符串的來源(從文本中的文本,從單元格中的數據庫等)。 – 2010-07-17 09:48:06

0

。根據內存的可用性,閱讀內容。做一個indexOf並獲得你需要的所有行。加載下一組內容。

如果從文件中讀取使用nio流。

可能是想法不好,但我相信在java。它將使用最好的算法。

如果使用正則表達式會更好。