繁体   English   中英

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

[英]most efficient Java data structure for searching triples of strings

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

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

假设为我提供了一个双精度字符串-例如,(效果,动词),并且我需要快速查看列表以查看该对是否出现,如果确实出现,则其值为yes或no。 (在此示例中,确实出现了双精度,并且值为“ no”。)

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

谢谢!

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

您可以创建一个对象,即保存前两个值的YourDouble,也可以将一个附加到另一个(如果值仍然是唯一的)之后,然后使用HashMap<String, String>

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

(不利之处在于,至少每个Arity都需要一种类型,例如,对于“单场”地图仅使用String,对于两场地图仅使用Pair ,对三场地图使用Triple 。)

您可以使用HashMap ,其中的键是前两个字符串(用于查找的字符串)的连接,并且值是布尔值,表示yesno字符串。

另外,第二列中的单词似乎会更少,因为它们代表类别。 您可能有一个HashMap<String, HashMap<String, Boolean>> ,其中您首先通过“名词”,“动词”等进行索引,然后通过例如“ car”,“ dog”,“ effect”进行索引以获得给你的布尔值。 这可能会更节省空间。

10k在我看来并不大。 您尝试过数据库吗?

查找此类信息的地方是语义网 许多项目都在这种类型的Triple Stores上工作。 实现的“三重存储”页面底部有一个列表。

就Java而言,您的算法几乎肯定会依赖于语言,如果您发现用C实现的良好算法,其Java端口也将很快。

另外,您的数据集是什么样的? 是否有很多2个匹配项,使得主语和动词经常相同? 您希望获得多少场比赛? MapReduce在查找10k中的一个匹配项时会很好地工作,但是执行返回8k的10k的查询(其中查询不容易分区)时,MapReduce效果不佳。

也有专门针对此问题的查询语言: SPARQL 尽管10k似乎还没有那么大,但bigdata博客有一些不错的见解。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM