我需要在数据结构中存储几百个字符串。每个字符串都有两个与它相关的字段,就像说出字的含义和它的起源一样。我可以以任何方式存储字,比如排序,反向排序或任何你喜欢的字。快速搜索字典
我只需要尽快搜索字典中的字符串并获取两个相关字段。如果可能的话,我希望我的搜索比二进制搜索更好。
我正在使用Java。我应该使用哪个data structure
或Collection Class
?
注意:我不想在此使用数据库。
我需要在数据结构中存储几百个字符串。每个字符串都有两个与它相关的字段,就像说出字的含义和它的起源一样。我可以以任何方式存储字,比如排序,反向排序或任何你喜欢的字。快速搜索字典
我只需要尽快搜索字典中的字符串并获取两个相关字段。如果可能的话,我希望我的搜索比二进制搜索更好。
我正在使用Java。我应该使用哪个data structure
或Collection Class
?
注意:我不想在此使用数据库。
您可以使用HashMap<String,MyDataObject>
- 这将是最快和最简单的使用。
平均寻道时间是O(|S|)
,其中|S|
是字符串的长度。
您也可以尝试和使用trie或radix tree,但在开始使用该解决方案之前,请确保您想通过分析HashMap
解决方案来给它时间。
使用HashTable
或HashMap
您的结构应该是这个样子HashMap<String,Bookcontent>
其中BookContent
是属性词的含义和由来类
答案显然是“使用HashMap
”,但这不是没有警告。您搜索的每个字符串都需要计算其哈希码。如果您每次使用新对象,则每次支付O(s是此例中的字符串长度),再加上另一个O(s)以检查equals
。
解决这个问题的一个方法是用intern
所有用于搜索的字符串。这将确保一次计算的哈希码被重复使用,并且还会使后续的检查短路。
另一种选择是使用trie。它的优点是您最多支付O(s),但通常较少—这是一个基于前缀的搜索,因此只要您遍历到前缀唯一的位置,就会得到结果。总之,如果您可以安排重复使用interned
字符串,那么基于哈希码的解决方案是最佳选择;如果您可以安排重复使用interned
字符串,如果不是的话,一个trie是一个很好的选择。
其他常见的选项将是一个跳过列表(在Lucene中使用)和B-tree(在数据库索引中通用)。
纠正我,如果我错了,但发现哈希匹配后应该仍然应用“equals()”方法 - 除非存储的String和查找的String是*完全相同的对象*无论如何它都是'O(| S |)'。 – amit
@amit如果密钥被实施,那就会发生 - 将使用完全相同的对象。 –
我建议你使用Trie数据结构。我已经完成了一项类似于此的任务。 此link可帮助您实施Trie DS。
您寻找完全匹配或寻找类似于'foo'的东西也会返回'foobar'的条目吗? – Stephan
嗯,我正在寻找完全相同的东西。但是,如果后者可以完成,我希望它.. – OneMoreError