【问题标题】:What would be the Big O notation for this algorithm该算法的大 O 表示法是什么
【发布时间】:2017-12-07 16:38:45
【问题描述】:

判断字符串是否包含至少 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) for str.length() 其中 n - 字符串的长度
  • O(1) for str.length() > 128

但什么是摊销的大 O 值?


附言

也可以通过使用某种数据结构(例如map)来代替排序,它将操作量减少到O(n),但会增加内存成本。无论如何,它与问题无关。

【问题讨论】:

  • O(n log n)
  • @MauricePerry 但是为什么呢?对于某些范围 (0
  • 128 个字符可能表示字符串中允许的字符,而不是长度。

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


【解决方案1】:

严格来说,这个算法的时间复杂度是O(1),因为操作的数量T(n)不依赖于输入的大小(对于足够大的n)并且受限于一些常数操作。

【讨论】:

    【解决方案2】:

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

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

    换句话说 - 术语“摊销复杂度”没有关于输入的假设对您的算法没有多大意义。

    【讨论】: