我希望这个算法的时间复杂度是稳定的,但是它的名字暗示它实际上是在计数标记。
如果你好奇的话,这里是实现代码:
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
可以改变(看起来是可以的),那么它就不是常数时间复杂度。同时还需要考虑skipDelimiters
和scanToken
的复杂性。
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;
}
所以,是的,它是线性时间。
不,它不是常数时间,而是ω(n)
,其中n
是字符串的长度。
StringTokenizer的一个天真实现应该需要O(n * d)
,其中n
是字符串的长度,d
是分隔符的数量。