2012-03-21 30 views
3

我需要從給定單詞中分離所有可能的後綴(大約1000)。我正在考慮使用字典。使用字典分隔後綴

在這樣做時,我會將後綴作爲關鍵字(以及關於後綴的其他信息作爲進一步過程中所需的值)。如果最長可能的後綴是4個字母,我會搜索詞典中所有可能的組合。 例如: 給定一個詞:'abcdefg'我會搜索'g','fg','efg'和'defg'的詞典。

我已經做了一些研究,並沒有發現字典的很多類似的用法。這可能是一個可行的解決方案,或者我在這裏錯過了什麼?幫助很多appriciated。

+0

我不明白的要求:你是從字符串生成後綴?代碼在使用RE時看起來如何? – 2012-03-21 13:58:49

+0

[networkx](http://networkx.lanl.gov/)可能更適合搜索。我不明白正則表達式部分,你只是用它們來分割你的後綴? – 2012-03-21 14:00:42

+0

我想過使用正則表達式來進行預處理,因爲大多數後綴可以細分爲更小的塊......但是我沒有真正寫下這個想法,我會把它編輯出來。 – root 2012-03-21 14:16:30

回答

3

如果後綴不是太長,你的解決方案細的聲音 - 這是隻有少數字典每個字看起坐,和字典查找窗口快。我不認爲更復雜的解決方案(比如使用trie)在這裏值得。爲了僅刪除後綴,您也可以使用集合而不是字典,但由於您需要每個後綴的附加信息,字典似乎是自然選擇。

1

最簡單(可能不是最快)的方法是查找列表中的所有匹配項。有1000件產品,你不應該有太多的性能問題。

>>> sufx = ['foo', 'bar'] 
>>> [s for s in sufx if 'bazbar'.endswith(s)] 
['bar'] 
>>>[s for s in sufx if 'bazbaz'.endswith(s)] 
[] 
>>> [s for s in sufx if 'bazfoo'.endswith(s)] 
['foo'] 
+0

這個算法的最壞情況是O(n * k),其中n是後綴的數量('len(sufx)'),k是要測試的字符串的長度。 – Darthfett 2012-03-21 15:09:17

0

我不確定我是否正確理解您的用例。我想這是關於你正在處理後綴的事實,他們很難被發現。

一個典型的方法(通常在索引情況下)將是圍繞你的字符串,並將後綴作爲前綴處理。然後,您可以在反轉後綴的排序列表中進行簡單的二分搜索(因此前綴)。

1

參見Time Complexity of a dict。字典查找時間非常快(平均O(1)!)。對於這個實現,找到最長後綴的平均時間複雜度將是O(k^2),其中k是你單詞的長度。由於''.join操作(由於字符串不支持O(1)appendleft操作,將需要類似的O(n)操作(如反轉或字符串切片),因此該值爲k^2。

做的簡單方法(測試蟒蛇3):

>>> from collections import deque 
>>> word = "antidisestablishmentarianism" 
>>> suffixes = {'ism': 3, 'anism': 6, 'ment': 4, 'arianism': 12} 
>>> suffix = deque() 
>>> longest = None 
>>> for char in reversed(word): 
...  suffix.appendleft(char) 
...  suf = ''.join(suffix) 
...  if suf in suffixes: 
...   longest = suf 
... 
>>> longest 
'arianism' 
相關問題