Java 我对这个算法的时间复杂度分析正确吗?

Java 我对这个算法的时间复杂度分析正确吗?,java,performance,time-complexity,big-o,Java,Performance,Time Complexity,Big O,长话短说,我希望验证以下代码的时间复杂性是否正确 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--;

长话短说,我希望验证以下代码的时间复杂性是否正确

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=0

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


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

    我很确定运行时是O(N)

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

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


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

    我没有详细介绍,但我的第一个想法是,您可以/应该简单地用N.K和L来分析它,我认为这是过度复杂的。如果您使用K和L,那么您需要解释如何减少2(N-K)/L+K+L到O(N)。不要手动执行该步骤。如果
    N
    字符串s
    中的字符数,则代码将遍历所有这些字符一次。因此,总体复杂度将是
    O(N)
    。去掉K和L会帮你简化这件事。换句话说,与您的假设相关,您的外循环遍历字符串中的每个“单词”,内循环遍历这些单词的每个“字符”。实际上,当我们有一个由单个字母组成、由单个空格分隔的字符串时,输入字符串
    N
    @JohnKugelman的所有字符k和l都不会变得有意义。基本上,当k=n/2和l=n/2时,我们是否应该对此进行解释?@JohnKugelman我将它们简化为O(n),因为输入大小n没有二次项,因此渐近最紧界可以被视为O(n),或者我遗漏了什么?很抱歉,我应该澄清一下,n是字符串长度。为什么k+l可以忽略不计,当字符串由单个字母组成时,由字符串中的空格分隔。基本上,当k=n/2和l=n/2时,我想我们可以用n来写k和l,但在这种情况下,我们将把它们和第一个n结合起来,前面的项仍然会消失。