Java StringTokenizer.countTokens() 的时间复杂度是什么?

3

我希望这个算法的时间复杂度是稳定的,但是它的名字暗示它实际上是在计数标记。


2
不,它不是常数时间。 - shmosel
3个回答

5

如果你好奇的话,这里是实现代码:

public int countTokens() {
    int count = 0;
    int currpos = currentPosition;
    while (currpos < maxPosition) {
        currpos = skipDelimiters(currpos);
        if (currpos >= maxPosition)
            break;
        currpos = scanToken(currpos);
        count++;
    }
    return count;
}

我对StringTokenizer不太熟悉,但是假设maxPosition可以改变(看起来是可以的),那么它就不是常数时间复杂度。同时还需要考虑skipDelimitersscanToken的复杂性。


1
抢先一步了 ;) - JSCoder says Reinstate Monica

3
OpenJDK的API文档中写到: http://www.docjar.com/html/api/java/util/StringTokenizer.java.html
public int countTokens() {
    int count = 0;
    int currpos = currentPosition;

    while (currpos < maxPosition) {    
         currpos = skipDelimiters(currpos);  
         if (currpos >= maxPosition)   
            break;    

         currpos = scanToken(currpos);    
         count++;    
     }    
     return count; 
 }

所以,是的,它是线性时间。


1
所以是的 - OP问它是否是常数时间。我猜这里应该是不是。只是一个小注释而已。 - Zabuzard
是的,我把“希望”解释成了“你能确认怀疑吗”。 - JSCoder says Reinstate Monica

0

不,它不是常数时间,而是ω(n),其中n是字符串的长度。

StringTokenizer的一个天真实现应该需要O(n * d),其中n是字符串的长度,d是分隔符的数量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接