2013-11-25 91 views
4

我正在尋找一些高層次的想法/想法幫助我構建字典的數據結構。我有一個傳統的'產品(醫學)搜索系統',它本質上非常緩慢和複雜。我們需要完全重新構建系統以實現高效和可維護的解決方案。字典的建築數據結構

爲了簡化問題,我採取「詞典」(我希望我的新系統的行爲像字典)

  1. 我應該能夠存儲字,描述和幾個同義詞(相當於仿製藥)的例子,
  2. 單詞不應該重複
  3. 同義詞也將是Word的實例(它應該帶有單詞,描述和同義詞的行爲)。
  4. 搜索速度更快

UseCases

  1. 當一個字進行搜索,它的含義和同義詞顯示
  2. 更快的搜索
  3. 去除代名詞應該是可能的
  4. 添加新詞,應該可以添加到任何現有的單詞的同義詞

我創建了下面

Class Word { 
    String meaning; 
    List<Word> synonyms; 
} 

要存儲單詞所示的數據結構,我想用TreeSet

因爲

TreeSet的規定,使用 Set接口的實現存儲的樹。對象按照升序順序存儲。 訪問和檢索時間非常快,這使得TreeSet成爲 極好的選擇,因爲在存儲大量必須快速找到 的分類信息時。

或者我可以使用HashMap,其中單詞和同義詞單詞實例的哈希碼相等,這可以實現更快的檢索。

我仍然能看到很多的挑戰

  1. 當過新詞被添加如何與它的同義詞鏈接時,有字的數量龐大

  2. [查詢將是緩慢

  3. 編輯詞也應反映同義詞,反之亦然

任何想法/輸入/技巧將予以高度重視

+2

我在現實世界中建立了這樣一個系統。單詞*不是*獨特的。相同的拼寫可以有多種形式(動詞,名詞,形容詞等)或相同的形式(名詞),但可以有多個獨立的含義,其中每個含義都有自己的一組同義詞。單詞可以有替代拼寫。在實踐中,你需要多個層次:一個用於純拼寫,一個用於單詞類型,一個用於特定的詞義。在最底層,您可以添加一些關注點(例如,鏈接到同義詞)。 – beerbajay

+0

你想如何搜索一個詞?如果你不關心排序,爲什麼使用'TreeSet'而不是'HashSet'?爲什麼同義詞也需要成爲一個「單詞」,根據定義,他們與父母「詞」共享他們的「意義」? –

+0

用例更新了問題,TreeSet應該比HashSet更快地檢索。 –

回答

2

對於單詞搜索和單詞完成要求Trie將是一個快速的選擇。看看Java implementations

在計算機科學中,特里也被稱爲數字樹,有時 基數樹或前綴樹(因爲它們可以通過前綴搜索),是一種 有序樹數據結構,是用於存儲動態集合或關聯數組,其中鍵通常是字符串。

http://pathakalgo.blogspot.in/2012/11/trie-data-structure-implementation-in.html

https://www.google.co.in/search?q=Trie&client=ubuntu&channel=cs&oq=Trie&aqs=chrome..69i57j69i60l2.856j0j1&sourceid=chrome&ie=UTF-8

對於同義詞聯動,可以保持Map<String, LinkedList<String>>。一旦找到使用Trie的單詞,獲取相關的系統名稱將是O(1)。

+1

'Trie'非常好,但是我正在尋找同一個節點(單詞)在不同層次被引用(與樹的概念相反) - 恐怕會變得太亂 –

+0

我同意你的看法,我應該能夠擴展'Trie'算法以符合我的要求(存儲同義詞) –

+1

是的,這就是我正在尋找的東西..我認爲找到兩個不同要求的解決方案不會導致一個簡單的實現。如果你可以從'word'對象中分離'synonym'列表,那麼事情就不那麼混亂了。 – harsh

2

你可以使用Trie存儲在字典中的所有單詞。爲每個單詞(節點)添加一個synonims列表。