为了补充优秀答案,我们可以查看代码:
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)
最坏的情况是O(n),除非两个字符串是同一个对象,在这种情况下是O(1)。
(虽然在这种情况下,n是指两个字符串中从第一个字符开始的匹配字符数,而不是字符串的总长度)。
这里的其他答案过于简单化了。
通常,证明两个不同的字符串相等是O(n),因为您可能需要比较每个字符。
然而,这只是一种最坏的情况:有许多快捷方式,这意味着在一般/典型情况下,equals()
方法可以执行得更好:
O(1)
:它们是相同的对象,因此根据定义相等,因此结果为真O(1)
(它们不可能相等,因此结果为false)O(1)
时间。如果您的字符串不是完全随机的,那么结果可能介于O(1)
和O(n)
之间,具体取决于数据分布。如您所见,确切的性能取决于数据的分布。
除此之外:这取决于实现,因此确切的性能特征将取决于使用的Java版本。然而,据我所知,所有当前的主要Java实现都进行了上面列出的优化,因此您可以期望equals()
在字符串上的性能非常快。
最后一个技巧:如果使用字符串内部处理,那么所有相等的字符串都将映射到同一个对象实例。然后,您可以使用极快的检查对象标识来代替保证为0(1)的检查对象标识。这种方法有缺点(可能需要插入大量字符串,导致内存问题,并且需要严格记住插入计划用于此方案的任何字符串),但在某些情况下它非常有用。
我是复杂性分析新手。任务是给定一个非空字符串(如“Code”)返回一个字符串(如“CCoCodCode”)。我有两个程序在做同样的事情。 程序1: 所以,上面的一个非常简单,这个程序有O(n^2)复杂度。 程序2: 从另一个StackOverflow问题来看,的时间复杂度似乎为O(n)。在这种情况下,程序2也具有O(n^2)时间复杂度。 我的分析是正确的还是遗漏了什么?
直到Java6,我们在上有一个常量时间子字符串。在Java7中,为什么他们决定复制数组——并降低线性时间复杂度——而像这样的东西正是为此而准备的?
问题内容: 切片Python字符串的时间复杂度是多少?鉴于Python字符串是不可变的,我可以想象对它们进行切片或取决于切片的实现方式。 我需要编写一个遍历(可能很大)字符串的所有后缀的函数。我可以通过将后缀表示为整个字符串的元组和一个索引以开始从中读取字符来避免对字符串进行切片,但这很丑陋。相反,如果我天真地像这样写我的函数: … …将其时间复杂度是或,其中是? 问题答案: 简短的答案:通常是切
问题内容: 我对Java中的StringPool感到困惑。我在阅读Java中的String一章时遇到了这个问题。用外行的术语,请帮助我了解StringPool的实际作用。 问题答案: 打印(即使我们不使用方法:比较字符串的正确方法) 当编译器优化你的字符串文字时,它会看到两者s和t具有相同的值,因此你只需要一个字符串对象。这是安全的,因为在中是不可变的。 结果,两者和都t指向同一个对象,节省了一些
我正在解决这个问题:回文子串 给定一个字符串,您的任务是计算该字符串中有多少回文子字符串。 具有不同开始索引或结束索引的子字符串被计为不同的子字符串,即使它们包含相同的字符。 我尝试了多种方法,根据我的说法,这两种方法的复杂性都为。但是leetcode接受一种解决方案并返回超过另一种解决方案的时间限制。 可接受的解决方案: 超出时间限制的解决方案 这两种算法中唯一的变化是,第一种算法使用Pytho
我有一个非常复杂的字符串,如下所示, 这里所有的JSON数据都在括号“[]”中,括号之间用“{…}”分隔支撑。在这里,我想要一个从所有花括号的消息,故事和属性。尝试了两件事一是二把所有的东西都放在一个JSON对象中,也尝试了一次无用的尝试来匹配regex“message:”但即使这样也没用。 从所有大括号中查找消息、故事和属性的方法是什么。