用于搜索字符串三元组的最有效的Java数据结构

时间:2011-10-31 13:04:42

标签: java search

假设我有一个大型列表(大约10,000个条目)的字符串三元组:

car    noun    yes
dog    noun    no
effect noun    yes
effect verb    no

假设我出现了一个双字符串 - 例如,(效果,动词) - 我需要快速查看列表以查看该对是否出现,如果出现,则表示其值是“是”还是“否”。 (对于此示例,双重确实出现,值为“no”。)

Java中用于存储列表的最佳数据结构是什么,以及执行搜索的最有效方法是什么?我正在运行成千上万的搜索,因此速度至关重要。

谢谢!

4 个答案:

答案 0 :(得分:5)

您可以考虑使用HashMap<YourDouble, String>。搜索将是O(1)。

你可以创建一个对象,YourDouble保存前两个值,或者将一个附加到另一个 - 如果值仍然是唯一的 - 并使用HashMap<String, String>

答案 1 :(得分:1)

我会为您想要的每种搜索类型创建HashMultimap,例如“全部三个”,“每一对”和“每个单独的领域”。当您构建列表时,填充所有不同的地图,然后您可以从适合您的查询的任何地图中获取。

(缺点是你需要至少每个arity的类型,例如,对于“单个字段”地图只使用String,但对于两个字段地图使用Pair,并且{Triple 1}}用于三场地图。)

答案 2 :(得分:1)

您可以使用HashMap,其中键是前两个字符串的串联,您将用于查找,并且值是布尔值,表示yes和{ {1}}字符串。

或者,似乎第二列中的单词会更少,因为它们代表类别。您可以首先使用no进行索引,例如“名词”,“动词”等,然后你通过例如索引“car”,“dog”,“effect”,以获得你的布尔值。这可能会更节省空间。

答案 3 :(得分:1)

对我来说,10k对我来说似乎并不大。你试过DB吗?

查找此类信息的地方是Semantic Web。许多项目只适用于这种类型的Triple Stores。三重存储实现页面底部有一个列表。

就java而言,你的算法几乎肯定会依赖于语言,如果你发现在C中实现了一个好的算法,它的java端口也会很快。

另外,您的数据集是什么样的?是否有很多2个匹配,主语和动词通常是相同的?你期望获得多少场比赛? MapReduce可以很好地找到10k中的一个匹配,但是在查询无法轻松分区的情况下执行返回8k的10k的查询时效果不佳。

还有一种仅针对此问题的查询语言:SPARQLbigdata blog有一些很好的见解,但10k似乎并不那么大。