假设我有一个大型列表(大约10,000个条目)的字符串三元组:
car noun yes
dog noun no
effect noun yes
effect verb no
假设我出现了一个双字符串 - 例如,(效果,动词) - 我需要快速查看列表以查看该对是否出现,如果出现,则表示其值是“是”还是“否”。 (对于此示例,双重确实出现,值为“no”。)
Java中用于存储列表的最佳数据结构是什么,以及执行搜索的最有效方法是什么?我正在运行成千上万的搜索,因此速度至关重要。
谢谢!
答案 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)
查找此类信息的地方是Semantic Web。许多项目只适用于这种类型的Triple Stores。三重存储实现页面底部有一个列表。
就java而言,你的算法几乎肯定会依赖于语言,如果你发现在C中实现了一个好的算法,它的java端口也会很快。
另外,您的数据集是什么样的?是否有很多2个匹配,主语和动词通常是相同的?你期望获得多少场比赛? MapReduce可以很好地找到10k中的一个匹配,但是在查询无法轻松分区的情况下执行返回8k的10k的查询时效果不佳。
还有一种仅针对此问题的查询语言:SPARQL。 bigdata blog有一些很好的见解,但10k似乎并不那么大。