繁体   English   中英

最快的Java字符串查找集合?

[英]fastest Java collection for string lookup?

我有一个Java类,其中包含两个String,例如一个人的姓名和该组的姓名。

我也有一个团体名单(约10个)和一个人名单(约100个)。 我的数据对象列表更大,可以超过10.000个项目。

现在,我想搜索我的数据对象,以便从人员列表中找到具有一个人员并在组列表中具有一个组的所有对象。

我的问题是:人员列表和组列表的最佳数据结构是什么?

我可以使用ArrayList并简单地迭代直到找到匹配项,但这显然效率不高。 HashSet或HashMap会更好。

有没有更有效的方法来解决这个问题? 请指教。

每个数据结构都有优点和缺点。

如果您具有访问键,则使用Map来检索O(1)中的数据。

List用于维护元素之间的顺序,但是无法使用键访问元素,并且您需要循环O(n)中发生的整个列表。

Trie是一个用于存储和查找字符串的良好数据结构:

它本质上是一个树结构,使用字符或子字符串表示要遵循的路径。

在此处输入图片说明

优于哈希图(引自Wikipedia):

  • 与不完善的哈希表相比,在最坏的情况下,O(m)时间(其中m是搜索字符串的长度)在特里中查找数据的速度更快。 不完善的哈希表可能会发生键冲突。 键冲突是不同键到哈希表中相同位置的哈希函数映射。 不完善的哈希表中最坏情况下的查找速度为O(N)时间,但更通常为O(1),其中O(m)时间用于评估哈希。
  • 尝试中没有不同键的冲突。 特里中的存储桶类似于存储键冲突的哈希表存储桶,仅当单个键与多个值相关联时才需要。
  • 不需要提供哈希函数或更改哈希函数,因为有更多的键添加到了Trie中。
  • 特里可以按键提供条目的字母顺序。

我同意@Davide的回答。.如果我们也想快速查找并保持顺序,那么可以使用Map的LinkedHashMap实现。 通过使用它,我们可以同时拥有两件事:

  1. 数据检索,如果我们有访问密钥。

  2. 我们可以保持插入顺序,因此在迭代时,我们将以与插入期间相同的顺序获取数据。

根据情况(如果在接收小组/人员列表之前有数据) ,对数据进行预处理将为您节省时间。

将数据与组/人员列表进行比较将需要至少10,000+次查找。 将组/人员列表与数据进行比较将最多需要10*100 = 1,000查询,如果一次与每个组进行比较( 10+100 = 110查询),则查询次数会更少。

暂无
暂无

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

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