【问题标题】:Data structure for O(1) search 95% of timesO(1) 搜索 95% 次的数据结构
【发布时间】:2019-01-14 02:20:20
【问题描述】:

需要设计一种数据结构,使得在95% 个案例中可以进行O(1) 次搜索,在5% 个案例中可以进行超过O(1) 次。我们能得到的最好的数据结构是什么?存储的元素可以是integerstring

PS:我的方法是使用哈希表。我知道它在大多数情况下都提供 O(1) 访问。但是我如何将其分类为 95% 和 5%。我也无法获得足够好的哈希函数。

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

【问题讨论】:

  • 你关心最坏的情况还是一般情况?

标签: data-structures hash


【解决方案1】:

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

假设您要插入 100 个元素,并且要获得 5% 的平均碰撞率,您希望碰撞概率从第一次插入时的 0% 上升到最后一次插入时的 10%。因此,哈希表应该有 1000 个插槽。

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

话说回来,好久不见,我请大家检查一下我的逻辑……

【讨论】:

    【解决方案2】:

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

    换句话说,所有的访问都是 O(1)。请注意,我们在这里讨论的是 O-notation,它内部有一个隐藏的常数因子。

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

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

    【讨论】:

      【解决方案3】:

      如果您在 最坏 的情况下关心 95% 的 O(1):如果您使用 cuckoo hashing,那么在 100% 的情况下搜索是 O(1)。换句话说,查找在最坏的情况下是恒定的。但是,通常使用常规哈希表(例如使用separate chaining)进行搜索在平均上会更快。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-27
        • 1970-01-01
        相关资源
        最近更新 更多