Data structures O(1)搜索95%时间的数据结构

Data structures O(1)搜索95%时间的数据结构,data-structures,hash,Data Structures,Hash,需要设计一种数据结构,以便在95%的情况下,在O(1)的次数内,以及在5%的情况下,在O(1)的次数内,都可以进行搜索。我们能达到的最佳数据结构是什么?存储的元素可以是整数或字符串 PS:我的方法是使用哈希表。我知道它大多数时候提供O(1)访问。但我如何将其分为95%和5%呢。此外,我还不能得到一个足够好的哈希函数 如果只有字符串,我可以使用hash*33+c,但是作为整数的可能性如何呢。另外,我应该使用的最佳表大小是多少?只要没有冲突,哈希表访问就是O(1)。因此,您需要这样一个哈希表,最多有

需要设计一种数据结构,以便在
95%
的情况下,在
O(1)
的次数内,以及在
5%
的情况下,在
O(1)
的次数内,都可以进行搜索。我们能达到的最佳数据结构是什么?存储的元素可以是
整数
字符串

PS:我的方法是使用哈希表。我知道它大多数时候提供O(1)访问。但我如何将其分为95%和5%呢。此外,我还不能得到一个足够好的哈希函数


如果只有字符串,我可以使用
hash*33+c
,但是作为整数的可能性如何呢。另外,我应该使用的最佳表大小是多少?

只要没有冲突,哈希表访问就是O(1)。因此,您需要这样一个哈希表,最多有5%的插入会导致冲突。显然,我们想要假设一个好的、统一的哈希函数。所以

假设插入100个元素,为了获得5%的碰撞平均值,希望碰撞概率从第一次插入时的0%增加到最后一次插入时的10%。因此,哈希表应该有1000个插槽

如果您希望在读取时最多有5%的冲突,那么您需要2000个插槽(因为对于所有读取,您将处于上次插入的最终冲突百分比,因此数据总量应为哈希表大小的5%)


再一次,已经有一段时间了,我请大家检查我的逻辑…

如果随着添加更多元素而增加哈希表的大小,那么访问不是O(1)的可能性变为零(当然,使用适当的哈希函数)

换句话说,所有访问都是O(1)。请注意,我们在这里讨论的是O表示法,其中有一个隐藏的常数因子

例如,还有整数散列函数。或者,您可以使用一个通用哈希函数来实现此目的(即,将整数视为字节数组,并为此计算哈希)

关于最佳哈希表大小:一般意义上没有最佳大小。您需要详细说明关于什么是最佳的确切要求。通常的做法是将负载系数保持在75%以下,这样大多数访问只需要一次比较。

如果在最坏的情况下关心95%的O(1):如果使用,则在100%的情况下搜索是O(1)。换句话说,在最坏的情况下,查找是恒定的。但是,通常使用常规哈希表(例如with)进行搜索平均速度更快


如果您关心平均情况下95%的O(1):例如,使用单独的链接,我认为没有办法保证在最坏的情况下搜索是O(1)。你只能谈论一般情况。当然,您可以使用单独的链接和足够小的负载因子,平均而言,您将在95%的情况下获得一次查找。但这并不能保证如此。你可能运气不好,然后只有90%的搜索是O(1)。对于O(1)中95%的平均情况搜索,负载将需要按照以下要求:碰撞概率为5%。

您关心最坏情况还是平均情况?