这个算法的Big O表示法是什么?

时间:2017-07-04 09:24:17

标签: algorithm performance time-complexity big-o complexity-theory

确定字符串是否包含至少1个可重复的字符。

(暗示该字符串只能包含基本的ASCII字母:128个字符)。

bool hasRepeatableChar(String str) { 
    if (str.length() > 128) {
            return true;
    }
    str = str.sort();
    for (int i = 0; i < str.length()-1; i++) {
        if (str[i] == str[i+1]) {
            return true;
        }
    }
    return false;
}

我可以看到,它是:

  • O(n log n)表示str.length()&lt; = 128,其中n - 字符串的长度
  • 对于str.length()&gt;
  • O(1) 128

但是什么是摊销的大O值?

P.S。

它也可以通过使用某种数据结构(例如map)来完成,而不是对它进行排序,它会减少对O(n)的操作量,但会增加内存成本。无论如何,这与问题无关。

2 个答案:

答案 0 :(得分:7)

严格地说,此算法的时间复杂度为O(1),因为操作数T(n)不依赖于输入的大小(足够大n)并且是受到一定数量的操作的限制。

答案 1 :(得分:3)

算法的amortized analysis应该基于预期的输入。

在你的情况下 - 没有任何关于预期输入长度分布的任何先验知识 - 你可以说没什么。

换句话说 - 术语&#34;摊销的复杂性&#34;没有关于输入的假设对你的算法没有多大意义。