【问题标题】:Array subset using hashing使用散列的数组子集
【发布时间】:2017-05-02 23:47:58
【问题描述】:

检查 arr2 是否是子集。 输入:arr1[] = {11, 1, 13, 21, 3, 7}, arr2[] = {11, 3, 7, 1} 输出:arr2[]arr1[] 的子集

如果我们使用线性探测。 哈希表将如下所示: {0=7, 1=1, 2=13, 3=21, 4=3, 5=11} 其中第一项是索引(散列代码)第二项是值 如果您看到元素 7。哈希码是 7%6=1。因此,从 1 开始,它必须通过检查每个存储桶来遍历完整的哈希表。这里的时间复杂度是 O(n)

稍后我们将使用哈希表搜索arr2 中的所有元素。

因此总体时间复杂度将为 Len(arr2)*O(n)。

那么散列有什么好处呢?

【问题讨论】:

    标签: arrays hash hashtable subset


    【解决方案1】:

    哈希表中搜索操作的最佳情况复杂度不是 O(n),而是 O(1)。所以在最好的情况下,你会得到复杂度 Len(arr2) * O(1) => Len(arr2),我们可以把它当作 O(1)。 另一方面,最坏情况的复杂度实际上是 O(n)。 因此,您应该查看整个算法的摊销成本,这将低于 O(n)

    【讨论】:

    • 你怎么能说整体复杂度为 O(1)。 Len(arr2) 将是 N。它必须遍历完整的数组。
    • 我知道你提到的那些东西。但是为这种情况做一个试运行。您将必须遍历完整的哈希表并返回 0 。所以 O(n) 是复杂度。所以,总体复杂度:O(M*N)
    • 好的,我们可以将 Len(1) 表示为 n,将 Len(2) 表示为 m,最好情况下总复杂度为 O(m),最好情况下为 O(mn ),但摊销复杂度将小于 O(mn)。这种情况下,如果你不使用哈希表,它将是 O(mn)
    • @SachitMurarka 通常,任何独立案例都不代表算法,您应该尽可能多地使用边缘案例进行检查
    • 是的。确实如此。如果我们使用哈希表,我们的复杂度将在 1 到 mn 之间
    猜你喜欢
    • 1970-01-01
    • 2010-12-04
    • 2015-10-09
    • 1970-01-01
    • 2012-06-12
    • 2013-09-24
    • 2014-08-31
    • 2015-11-16
    • 2017-07-02
    相关资源
    最近更新 更多