我正在学习关于大记法的过程。对于下面的代码,我有一个计算单词数量的程序,跳过分隔符。对于这个算法,for循环将是句子的长度,然后包含迭代到字符串的包含。所以根据我的说法,这个算法的大哦符号是O(n ^ 3)。这是正确的还是我错过了一些关于大哦符号的东西?
public class wordCount {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String sentence = "How are you,zak;far: mon. day ?:";
int count = 1;
ArrayList<Character> delim = new ArrayList<Character>();
delim.add(' ');
delim.add(',');
delim.add('.');
delim.add(':');
delim.add(';');
delim.add('"');
delim.add('\'');
for (int i = 0; i != sentence.length() - 1; i++) {
if (delim.contains(sentence.charAt(i))) {
if (!delim.contains(sentence.charAt(i + 1))) {
count++;
}
}
}
System.out.println("The count is: " + count);
}
}
答案 0 :(得分:6)
不,你不太对 - 你假设contains
的O(n)的“n”与你感兴趣的“n”相同。它不是 - 它是数组列表的长度。在这种情况下,这是分隔符的数量,而不是句子长度。
所以你的算法实际上是O(N * M),其中N是句子长度,M是分隔符的数量。如果您将分隔符集视为常量而仅将您的句子作为输入,则整个算法为O(N)。
即使您第二次有条件地呼叫contains
,每次迭代的contains
次呼叫总数也只是1或2次 - 它不能增长到(比方说)分隔符的数量或句子的大小。
答案 1 :(得分:1)
这不是那么简单。假设我们调用字符串N的长度和delim
M的长度。
对于字符串中的每个字符,您调用delim.contains(...)
一次或两次(即O(M)),因此最终的复杂度应为O(N x M)。
答案 2 :(得分:1)
因为这非常像家庭作业(如果是,请添加homework
标签),我会提供一些观察而不是解决方案:
这里有两个不同的“N”,sentence
的长度和delim
中的项目数。这些数字可能大不相同。
你需要了解ArrayList<T>.Contains
的大哦表现。你知道那是什么吗?
答案 3 :(得分:0)
你必须考虑循环内部有多少循环(以及这些循环走多远)
你彼此之间的圈数不超过两个,而不是三个。
for (int i = 0; i < sentence.length()-1; i++) { // loop level 1
boolean isDelim = delim.contains(sentence.charAt(i)); // loop level 2
if (!isDelim) continue;
if (!delim.contains(sentence.charAt(i + 1))) // loop level 2
count++;
}