Java 具有字符串对象的简单集合,允许在0(1)操作中进行搜索

Java 具有字符串对象的简单集合,允许在0(1)操作中进行搜索,java,search,collections,hashmap,processing-efficiency,Java,Search,Collections,Hashmap,Processing Efficiency,我有一个字符串对象的简单集合,大概有10个元素, 但我在生产环境中使用这个集合,这样我们就可以在该集合中搜索给定的字符串数百万次, 为了在0(1)时间内执行搜索操作,我们可以使用什么样的最佳收集或数据结构来获得最佳结果 我们可以在这里使用HashMap,但是搜索的顺序是在固定时间内,而不是0(1)。我想确保搜索是0(1) 如果存在,我们的数据结构必须返回true,如果不存在,则返回false。恒定时间为O(1)哈希映射可以。(或HashSet,具体取决于您是需要Set还是Map) 如果您的设置是

我有一个字符串对象的简单集合,大概有10个元素, 但我在生产环境中使用这个集合,这样我们就可以在该集合中搜索给定的字符串数百万次, 为了在0(1)时间内执行搜索操作,我们可以使用什么样的最佳收集或数据结构来获得最佳结果 我们可以在这里使用HashMap,但是搜索的顺序是在固定时间内,而不是0(1)。我想确保搜索是0(1)

如果存在,我们的数据结构必须返回true,如果不存在,则返回false。恒定时间为O(1)<代码>哈希映射可以。(或
HashSet
,具体取决于您是需要
Set
还是
Map

如果您的设置是不可变的,Guava的
ImmutableSet
会将内存占用减少约3倍(并且可能会给您一个提高速度的小常数)。

恒定时间为O(1)<代码>哈希映射可以。(或
HashSet
,具体取决于您是需要
Set
还是
Map



如果您的集合是不可变的,Guava的
不可变集合将减少~3倍的内存占用(并可能给您一个提高速度的小常数)。

使用
HashSet
结构。
contains()
操作的复杂性为O(1)。

使用
HashSet
结构。
contains()

如果不能像前面建议的那样使用HashSet/HashMap,可以编写一个实现

固定时间搜索?是的,
HashMap
可能是你最好的选择。请分别提问。你应该标记不同的解决方案。HashSet或类似的工具可能是一个不错的选择,但是当您有小集合时,不要低估简单数组搜索的速度。生成hashcode、查找hashcode和找到正确的bucket的开销也需要时间。一个只有10个元素的数组中的简单for循环可能是一个更好的选择,即使它不是常数。常数时间搜索?是的,
HashMap
可能是你最好的选择。请分别提问。你应该标记不同的解决方案。HashSet或类似的工具可能是一个不错的选择,但是当您有小集合时,不要低估简单数组搜索的速度。生成hashcode、查找hashcode和找到正确的bucket的开销也需要时间。在一个只有10个元素的数组中,一个简单的for循环可能是一个更好的选择,即使它不是常量。HashSet是否确保它提供了0(1)个搜索复杂度(如果是这样的话)。那我们就用吧不,不用了。仅当对象的哈希代码正确分布时。因此,它更多地介于O(n)和O(1)之间,这取决于实际数据及其hashCode()的实现。但正如前面所说,哈希(Map | Set)可能是你最好的选择。是的,我知道我们不能保证它的0(1)大部分时间是0(c)。但是我可以设计任何自定义数据结构,使其在0(1)中给出。谷歌的番石榴收集集是否有助于使用不可变的收集集?它至少有助于减少内存足迹吗。由于我们在游戏行业中使用每条消息,如果我们能够实现这一点,Guava将带来巨大的性能提升
ImmutableSet
,这将减少内存占用(与
HashSet
相比),并且可能会以一个小的恒定因数加快速度。根据a)字符串的长度,b)多次获得相同查询的频率,c)是否愿意支付增加的内存开销,实现trie可能是值得的。HashSet是否确保提供0(1)搜索复杂度(如果是这样的话)。那我们就用吧不,不用了。仅当对象的哈希代码正确分布时。因此,它更多地介于O(n)和O(1)之间,这取决于实际数据及其hashCode()的实现。但正如前面所说,哈希(Map | Set)可能是你最好的选择。是的,我知道我们不能保证它的0(1)大部分时间是0(c)。但是我可以设计任何自定义数据结构,使其在0(1)中给出。谷歌的番石榴收集集是否有助于使用不可变的收集集?它至少有助于减少内存足迹吗。由于我们在游戏行业中使用每条消息,如果我们能够实现这一点,Guava将带来巨大的性能提升
ImmutableSet
,这将减少内存占用(与
HashSet
相比),并且可能会以一个小的恒定因数加快速度。根据a)字符串的长度,b)多次获得相同查询的频率,c)是否愿意支付增加的内存开销,实现trie可能是值得的。是的,我也可以使用HashSet HashMap,但我们正在考虑是否应该使用第三方可用库。像谷歌的番石榴和珍宝。使用身份哈希映射会有帮助吗?因为使用第三方API很难,除非它值得。这些Gauva和Trove API在工业
IdentityHashMap
中的使用程度几乎肯定会伤害您,而不是帮助您。番石榴被广泛使用;特别是,它基本上在所有基于Java的Google服务中使用。是的,我也可以使用HashSet HashMap,但我们正在考虑是否应该使用第三方可用的库。像谷歌的番石榴和珍宝。使用身份哈希映射会有帮助吗?因为使用第三方API很难,除非它值得。这些Gauva和Trove API在工业
IdentityHashMap
中的使用程度几乎肯定会伤害您,而不是帮助您。番石榴被广泛使用;特别是,它基本上用于所有基于Java的Google