【问题标题】:Java: Hash method time complexityJava:哈希方法时间复杂度
【发布时间】:2018-09-14 16:07:51
【问题描述】:

我很难理解哈希表的时间复杂度是如何假设为常数 O(1)。我理解冲突的复杂性如何可能是 O(n) 但如果例如我有哈希方法

public int hash(String key)
{
    int hashVal = 0;

    for (int i = 0; i < key.length(); i++)
        hashVal = 37 * hashVal + key.charAt(i);

    hashVal %= tableSize;

    if (hashVal < 0)
        hashVal += tableSize;

    return hashVal;
} 

假设没有冲突,时间复杂度不应该是 O(n),因为哈希方法本身使用 for 循环到 key.length() 进行计算,然后需要调用这个方法来进行添加、删除和搜索方法?

【问题讨论】:

  • 这里的n 是什么?
  • 您缺少n 的定义。 HashSetO(1) 性能是插入一个元素的摊销性能。它不关心元素的hashCode() 方法有多慢,因为这是一个常数(平均而言)。例如。如果字符串平均长度为42,那么性能是42,但是在做Big-O的时候去掉了常量,所以性能还是O(1),即constant(on平均)。

标签: java hash time-complexity big-o hashtable


【解决方案1】:

当谈到哈希表的复杂性时,n 是指您将添加到哈希表中的 事物 的数量。是的,您可以说(假设没有冲突)从哈希表获取/设置项目的时间复杂度是哈希函数的时间复杂度(这当然取决于您的哈希函数)。在您发布的示例哈希函数中,假设密钥长度的上限常数是合理的,这意味着它实际上是 O(1)。但是,如果您的密钥长度可变,您应该说它是 O(k),其中 k 是密钥的长度。

【讨论】:

    猜你喜欢
    • 2020-11-19
    • 2012-02-02
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-12
    • 2013-03-14
    • 1970-01-01
    相关资源
    最近更新 更多