需要设计一种数据结构,以便在O(1)
的情况下95%
次可以进行搜索,而在O(1)
的情况下可以进行5%
次以上的搜索。我们可以得到的最佳数据结构是什么?存储的元素可以是integer
或string
。
PS:我的方法是使用哈希表。我知道它大多数时候都提供O(1)访问。但是我如何将其分为95%和5%。另外,我还不能提供足够好的哈希函数。
如果仅存在字符串,我可以使用hash*33+c
,但是作为整数的可能性呢?另外我应该使用的最佳表大小是什么?
答案 0 :(得分:0)
只要没有冲突,哈希表访问就是O(1)。因此,您需要一个哈希表,以使最多5%的插入会导致冲突。显然,我们要假设一个良好的,统一的哈希函数。所以...
因此,假设您要插入100个元素,并且要获得5%的平均碰撞率,您希望碰撞概率从第一次插入的0%上升到最后一次插入的10%。因此,哈希表应具有1000个插槽。
如果您希望在 read 上具有最多5%的冲突,则您需要2000个插槽(因为所有读取都将以最后一次插入的最终冲突百分比为准,因此总数量的数据应为哈希表大小的5%)。
再过了一段时间,我邀请所有人检查我的逻辑...
答案 1 :(得分:0)
如果随着添加更多元素而增加哈希表的大小,那么访问不是O(1)的可能性将变为零(当然,具有适当的哈希函数)。
换句话说,所有访问都是O(1)。请注意,我们在这里谈论的是O表示法,它内部有一个隐藏的常数因子。
也有整数哈希函数,例如here。或者,您也可以为此使用通用哈希函数(即,将整数视为字节数组,并为此计算哈希)。
关于最佳哈希表大小:一般意义上没有最佳大小。您需要指定关于最佳含义的确切要求。通常的想法是将负载率保持在75%以下,这样大多数访问只需比较一下即可。
答案 2 :(得分:0)
如果在最坏情况下您关心95%的O(1):如果使用cuckoo hashing,则在100%的情况下搜索为O(1)。换句话说,在最坏的情况下查找是恒定的。但是,经常使用常规哈希表(例如,使用separate chaining进行搜索),在平均值上会更快。
如果您在平均值情况下关心95%的O(1):例如单独的链接,我认为在最坏的情况下,没有办法保证搜索O(1)。您只能谈论平均情况。当然,您可以使用单独的链接和足够小的负载因子,并且在平均值上,在95%的情况下您将获得一次查找。但这并不能保证是这样。您可能运气不好,那么只有90%的搜索为O(1)。对于O(1)中95%的 average 案例搜索,需要根据birthday problem的冲突概率为5%。