这个哈希函数的时间复杂度是多少?

时间:2013-10-11 19:51:02

标签: hash big-o time-complexity

我有一个散列函数,我想知道它是否是常量。由于数组字的长度是常数,这是否意味着函数在Big O表示法中是恒定的?

public int hash(String s) {
    if (s.length() > 7)
        return -1;

    for (int i = 0; i < word.length; ++i) {
        if (word[i].compareTo(s) == 0)
            return i;
    }

    return -1;
}

4 个答案:

答案 0 :(得分:1)

  

由于数组字的长度是常数,这是否意味着函数在Big O表示法中是常量?

Big O用于描述进程的运行时间或内存消耗随着输入的增长而增长。如果你的数组长度恒定,那么它就不会增长并产生影响。因此,在这种情况下,您可以考虑在{(1)}中运行O(1),假设字符串比较是在相对恒定的时间内完成的。

考虑它的一种方法是说,由于数组的长度不是可变的,因此总是可以“展开”该循环,以便具有固定数量的O(1)比较。另一个,所有人仍将是O(1)。同样,这假设比较字符串所花费的时间也是恒定的(如果你有非常大的不同长度的字符串,实际上可能不是这种情况)。当然,如果您知道除了长度之外,数组的内容也是常量,那么您可以肯定地说该函数将是O(1)。

答案 1 :(得分:0)

比较两个长度为m和n的字符串所需的时间是O(min {m,n} + 1)。假设k是word数组的长度,m是word中最长单词的长度,n是输入字符串的长度。在这种情况下,函数进行O(k)字符串比较,每个字符串比较花费时间O(min {m,n} + 1)。因此,运行时间为O(k min {m,n} + m)。

现在,由于已知m是常量,我们可以简化它并说运行时将为O(min {m,n} + 1)。如果word中的所有字符串都是固定常量,则m是常量,运行时为O(min {1,n} + 1)= O(1),并且您的散列函数在恒定时间内运行。否则,如果它们无限长,那么你唯一能说的就是运行时为O(min {m,n} + 1)。

希望这有帮助!

答案 2 :(得分:0)

你的函数有复杂度O(N 2 ),因为它有2个输入:

  1. s - 你的字符串(长度N 1
  2. word - array(length N 2
  3. 所以,你的复杂性将是O(N 1 * N 2 ),可以简化为O(N 2 )< / p>

    如果长度N 2 实际上是const,那么在最坏的情况下函数将具有复杂度O(N 1 )。

    如果长度N 1 也有效 - 那么我们就有O(1)复杂度

答案 3 :(得分:0)

如果word是常数,则此函数为O(1)。

无论s的长度如何,

s.length()都会以恒定的时间运行。

运行word[i].compareTo(s)所需的时间受word[i]的长度限制。只要word没有改变,这就意味着运行整个for循环所需的时间有一个上限。

所以这个函数运行的时间有一个上限,函数是O(1)。

如果word可以改变,我相信这个函数将是O(n),其中n是word的大小。但是,如果word的元素长度增加,word[i].compareTo(s)将受越来越大的数字限制,因此s的长度可能会变得很重要。也许复杂性实际上是O(n ^ 2)。我不知道,现在我很好奇。