我有一个散列函数,我想知道它是否是常量。由于数组字的长度是常数,这是否意味着函数在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;
}
答案 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个输入:
所以,你的复杂性将是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.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)。我不知道,现在我很好奇。