找到我使用arraylist.contains的算法的大哦符号

时间:2012-06-18 14:45:10

标签: java arraylist

我正在学习关于大记法的过程。对于下面的代码,我有一个计算单词数量的程序,跳过分隔符。对于这个算法,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);
}
}

4 个答案:

答案 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++;
}