如何存储只需要';包含';Java中的操作

如何存储只需要';包含';Java中的操作,java,data-structures,hash,set,Java,Data Structures,Hash,Set,我有一个巨大的字符串列表(800万到1000万)。它们是维基百科的页面标题。在这些字符串上创建类似集合的数据结构后,我需要的唯一操作是boolean contains(String str) 简单的方法是只使用HashSet、TreeSet或类似的东西(例如,在Java中) 是否有更适合此用例的数据结构 PS:我们不能使用bloom筛选器,我们不想处理误报。如果您比常数时间contains()更关心节省空间,并且存储的字符串中有很多重叠,a可能会有所帮助。在这种情况下,contains(str)

我有一个巨大的字符串列表(800万到1000万)。它们是维基百科的页面标题。在这些字符串上创建类似集合的数据结构后,我需要的唯一操作是
boolean contains(String str)

简单的方法是只使用
HashSet
TreeSet
或类似的东西(例如,在Java中)

是否有更适合此用例的数据结构


PS:我们不能使用bloom筛选器,我们不想处理误报。

如果您比常数时间
contains()
更关心节省空间,并且存储的字符串中有很多重叠,a可能会有所帮助。在这种情况下,
contains(str)
将是
O(n)
,其中
n
str

的长度,我想说的是……bloom filtersNice建议。请注意,如果仔细考虑的话,这实际上是一个常数时间(运行时间不会随着集合的大小而增长,并且条目的大小是有限制的)。我只是有点担心
str
上的线性复杂性可能会影响性能。contains(str)操作每秒将运行数百次。@Felipe Hummel,你能缓存contains(str)结果吗?@TonyRad我想是的。但是cache+Trie可能使用与简单HashSet相同的内存。@FelipeHummel我不会这么担心。尽管
contains()
花费的时间更长,但
str
的时间也越长,这是一个非常简单的算法。即使为
HashSet#contains()
散列字符串,也必须首先计算字符串的
hashCode()
,即
O(n)
。试试看。