Java 从分析代码中构建求和?

Java 从分析代码中构建求和?,java,sum,time-complexity,big-o,code-analysis,Java,Sum,Time Complexity,Big O,Code Analysis,我明天有期中考试,我们应该能够分析代码。老实说,这是我唯一不明白的事情。基本上我们得到的是这样的东西: 考虑这个比较两个字符串的Java方法。这种方法有两个输入,因此我们应该使用两个变量来表示运行时间。设n为a的长度,设m为b的长度。我们可以将运行时间表示为n和/或m的函数。如果我们假定n

我明天有期中考试,我们应该能够分析代码。老实说,这是我唯一不明白的事情。基本上我们得到的是这样的东西:

考虑这个比较两个字符串的Java方法。这种方法有两个输入,因此我们应该使用两个变量来表示运行时间。设
n
a
的长度,设
m
b
的长度。我们可以将运行时间表示为
n
和/或
m
的函数。如果我们假定
n
,而不丧失一般性,这将有所帮助

  private static int compareStrings ( String a , String b) {
       int i = 0; 
       while ( i < a . length () && i < b. length ( ) ) { 
           if (a . charAt ( i ) < b. charAt ( i ) ) return −1;

           if (a . charAt ( i ) > b. charAt ( i ) ) return 1;

           i ++;
       }
       if (a . length () < b. length ( ) ) return −1; 
       if (a . length () > b. length ( ) ) return 1; 
 }

我不明白如何从这段代码中构建一个总和,或者如何获取它的运行时间。一步一步的指导会很好。这道题是练习题,不是家庭作业。我真的很想明白这一点

查看代码,它创建一个迭代器(i),然后遍历,直到到达其中一个字符串的末尾(显然,较短的字符串由长度n表示)

由于只有一个循环,而该循环只迭代n次,因此算法的“运行时间”可能被描述为计算将产生的“if”语句,或“2n+2”。在Big-O表示法中,这就是
O(n)
。末尾额外的两个if检查是常量,因此不用于计算

嗯,你要找的总数似乎是:

n
Σ k
i = 1

将此读为“对于i的1到n的每个值,将k添加到总数”,这将导致k*n(以及由此产生的O(n)的大O)。我在这里使用k,因为我不知道内部循环的成本,但它应该是常数。如果您觉得您的类将使用1表示“通过循环体的一次”,那么这也没关系。

最坏的情况是运行时间是O(n)

为什么?
1.因为我们假设n 当然,当最短字符串a中没有更多字符时,此条件将无法保持

  • 因为最坏的情况必须发生在while循环没有被返回中断时
  • 这与我们计算n次的情况一致

    唯一的规定是a是b的子串,这样a[0]==b[0]也可以

    成本是成本的总和

    • 评估while条件
    • 循环体中两个比较的成本等
    • 递增i
    它以nc+k为界,其中c是while循环体的最坏情况成本,k是只评估一次的操作成本(如返回语句),n具有先前约定的重要性


    如果您允许n不受约束地上升,您可以看到这符合O(n)的定义。

    好的,首先代码是错误的。它有一个Unicode字符而不是减号,如果没有任何条件匹配,它不会返回任何内容。这将不起作用,因为方法必须返回整数

    下面是固定的方法

    private static int compareStrings ( String a , String b) {
           int i = 0; 
           while ( i < a . length () && i < b. length ( ) ) {
               if (a . charAt ( i ) < b. charAt ( i ) ) {
                   return -1;
               }
    
               if (a . charAt ( i ) > b. charAt ( i ) ) {
                   return 1;
               }
    
               i ++;
           }
           if (a . length () < b. length ( ) ) {
               return -1; 
           }
           if (a . length () > b. length ( ) ) {
               return 1;
           }
    
           return 0;
     }
    
    这两条语句执行n次。每个操作包括3个独立操作(2个
    charAt(i)
    查找和1个条件评估)

    因此,这两个语句所花费的总时间将是
    6n
    时间单位

    其次是

    i++;
    //n unit of time
    
    这很简单,因为循环运行了
    n次
    并且是独立操作

    最后,下一个也是最后一个陈述是

    if (a . length () < b. length ( ) ) {
       return -1; 
    }
    //4 units of time
    
    现在这还不是最坏的情况,因为n的上界是m

    我们必须最大化
    n
    ,以使最坏的情况成为可能。
    n
    可以假定的最大值为
    m-1
    n
    (严格小于)

    所以在最坏的情况下

    n = m - 1
    
    替换总和表达式中的值
    12n+7

    sum = 12n + 7
        = 12(m-1) + 7
        = 12m - 5
    sum = 12m - 5
    
    这是我们第一部分的答案

    最坏情况下,方法的运行时间为总和 12米-5米

    现在既然这个函数的大O界是O(m)

    下面是大O的定义

    f(x)
    g(x)

    当且仅当对于某个足够大的常数x0,存在一个
    M
    ,以下为真

    这里

    因此,
    O(g(x)=O(m)
    是总和的上界

    大oh界中的简化和是
    O(m)

    代码没有编译..当字符串相同时会发生什么?@Roman它在假设中说ni检查?@Roman,因为它需要返回-1或-11取决于哪个更长。假设n代表a或b的较短长度,而不是a总是比b短。@billjamesdev不,假设还说明:让n是a的长度,让m是b的长度。好吧,这很有意义。我如何从中求和?这才是真正困扰我的问题。我想,我不知道你所说的求和是什么意思。你有办法知道每种语句需要多长时间吗?或者2n+2不是你需要的吗?我在帖子中添加了我要找的符号。我添加了求和。那么,如果我在while循环中添加了另一个循环,运行时间是否会变成O(n^2)?取决于您使用什么来限制循环。如果您想完全按照在外部循环中所做的操作,那么是的。但是,假设您首先要反转长字符串。您要执行一个循环以反转长字符串,然后进行如上所述的比较,最后得到O(n+m)…这又是O(n).:)
    if (a . length () < b. length ( ) ) {
       return -1; 
    }
    //4 units of time
    
    sum = 1 + (5n+2) + (6n) + n + 4
        = 12n + 7
    sum = 12n + 7
    
    n = m - 1
    
    sum = 12n + 7
        = 12(m-1) + 7
        = 12m - 5
    sum = 12m - 5
    
    f(m) = 12m -5
    g(m) = m
    
    m0 = 5/12
    M = 12