我想知道在Java中.equals操作的时间复杂度(大O)是为两个字符串。
基本上,如果我没有stringOne.equals(stringTwo)这在多大程度上执行?
谢谢。
我想知道在Java中.equals操作的时间复杂度(大O)是为两个字符串。
基本上,如果我没有stringOne.equals(stringTwo)这在多大程度上执行?
谢谢。
最坏的情况是O(n),除非两个字符串相同的对象在这种情况下它是O(1)。
(尽管在该情况下,n是指匹配字符的在从第一个字符,而不是串的总长度在开始两个字符串的数目)。
这里的其他答案是过于简单化。
在一般情况下,证明了两个不同的字符串相等是O(n)
因为你可能要每个字符进行比较。
然而,这仅仅是一个最坏的情况:有是否意味着许多快捷键equals()
方法可以执行平均/典型案例比这更好:
O(1)
如果字符串是相同的:它们是相同的目的是通过定义,以便等于这样的结果为真 O(1)
如果你能检查预先计算哈希码,这可以证明两个字符串不相等 (很明显,它不能帮助证明两个字符串是平等的,因为许多字符串散列相同的散列码)。 O(1)
如果字符串是不同的长度(他们不可能是相等的,所以结果是假) O(1)
时间来比较两个字符串。 如果你的字符串是不是完全随机的,那么结果可能是之间的任何地方O(1)
和O(n)
取决于数据的分布。 正如你所看到的,确切的性能取决于数据的分布 。
除此之外:这是依赖于实现如此精确性能特征将取决于所使用的Java版本。 不过,据我所知,目前所有的主要的Java实现做上面列出的最佳化,所以你可以期待equals()
对字符串的性能是相当快的。
最后一个技巧:如果你使用字符串实习则是等于将被映射到同一个对象实例的所有字符串。 然后你可以用极快的==
到位的检查对象身份equals()
这是保证是O(1)
这种方法有缺点(您可能需要实习生大量弦乐,引起内存问题,并且需要严格记得实习生,您打算用此方案使用任何字符串),但它在某些情况下非常有用。
这是为O(n),在不到,很容易成为可能,不可能的,所以这是它应该是什么。
要添加到优秀的答案,我们可以看到它看代码:
public boolean equals(Object anObject) {
if (this == anObject) { // O(1)
return true;
}
if (anObject instanceof String) //O(1) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) { // O(1)
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) { // O(n)
if (v1[i] != v2[i]) //O(1)
return false;
i++;
}
return true;
}
}
return false;
}
最好的情况下:O(1)
最坏的情况下:为O(n)