Java 从分析代码中构建求和?
我明天有期中考试,我们应该能够分析代码。老实说,这是我唯一不明白的事情。基本上我们得到的是这样的东西: 考虑这个比较两个字符串的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
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
- 评估while条件
- 循环体中两个比较的成本等
- 递增i
如果您允许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它在假设中说n
i检查?@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