2013-11-25 61 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列表。