【问题标题】:Am I right in my time complexity analysis for this algorithm?我对这个算法的时间复杂度分析是否正确?
【发布时间】:2021-08-25 01:35:40
【问题描述】:

长话短说,我正在寻找验证以下代码的时间复杂度是否正确。

class Solution {
    public String reverseWords(String s) {
        int len = s.length(); int i=len-1, j=0;
        StringBuilder answer= new StringBuilder();
        while(i!=-1) {
            if(s.charAt(i)==' ') i--;
            else {
                j=i;
                while(j-1!=-1 && s.charAt(j-1)!=' ' ) j--; //j++;
                answer.append(s.substring(j, i+1)).append(' ');
                i=j-1;
            }
        }
        return answer.toString().trim(); //trim last index's space
    }
}

约束:

  • 1 <= s.length <= 10^4
  • s 包含英文字母(大写和小写)、数字和空格“ ”。
  • s 中至少有一个单词

假设字符串长度为 N。 我的分析是进一步假设字符串 S 中有 K 个空格,并假设其中有 L 个不同的空格分隔的单词,根据给定的约束我们可以得出 L>=1 和 K>=0 的结论。

因此每个单词的平均长度为 NK/L,因此外部循环运行 K+L 次,内部循环独立于外部运行 2*(NK)/L 次,使总复杂度为 2(NK)/ L + K+L 仍然是 O(N) 的阶数。

我是否做出了错误的假设?有没有办法简化这个公式2*(N-K)/L + K+L

【问题讨论】:

  • 我没有仔细看,但我的第一个想法是你可以/应该简单地根据 N 来分析这个。 KL 让我觉得过于复杂了。
  • 如果你使用 KL 那么你需要解释如何将 2(NK)/L+K+L 减少到在)。不要挥手那一步。
  • 如果N 是您的String s 中的字符数,那么代码将遍历所有这些字符一次。因此,整体复杂性将只是O(N)。摆脱 K 和 L 将帮助您简化这一点。换句话说,与您的假设相关,您的外部循环遍历字符串中的每个“单词”,内部循环遍历这些单词的每个“字符”。有效输入字符串N的所有字符。
  • @JohnKugelman 当我们有一个由单个字母组成并由单个空格分隔的字符串时,k 和 l 不会变得重要。基本上当 k=n/2 和 l=n/2 时,我们不应该考虑吗?
  • @JohnKugelman 我将它们简化为 O(N) 只是因为没有输入大小 N 的二次项,因此可以将渐近最紧界视为 O(N) ,或者我错过了什么?

标签: java performance time-complexity big-o


【解决方案1】:

我很确定运行时间是 O(n)。

虽然我不太确定公式中的 N 是什么,但简化的一般规则是查看最大值。 我会假设 N 对你来说是最大的。 “+K+L”可以忽略不计,所以我们有 2*(N-K)/L。 分布:(2/L)N - (2/L)K。 我们删除常数并取最大的常数,所以它仍然是 O(n)

在我看来,查看运行时的一种更简单的方法是只查看代码在字符串中运行的次数。你的第一个 while 一直持续到它触发 else。从您停止的索引开始,第二个循环一直计数直到它停止。从那里,您将原始 i 更改为 j 并继续进行。我认为代码会查看 i 两次停止的位置,但这不足以改变复杂性(解决方法是将 j 设置为 i - 1,因为您知道 i 处的字符已经不是空格)。

作为一个简短的说明,N 通常表示输入的长度,无论是字符串长度还是数组大小。

【讨论】:

  • 对不起,我应该澄清一下,N 是字符串长度。
  • 为什么 K +L 可以忽略不计,当字符串由单个字母组成时,字符串中用空格分隔。基本上当 k=n/2 和 l=n/2 时
  • 我想我们可以用 N 来写 K 和 L,但在这种情况下,我们只需将它们与第一个 N 结合起来,前导项仍然会消失。
猜你喜欢
  • 1970-01-01
  • 2015-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
  • 2021-04-08
相关资源
最近更新 更多