例子问题
例子问题2:算法分析
考虑下面的代码:
代码的运行时是什么(用大o符号?)
运行时的最佳分析方法是逐行分解代码。迭代sum值的行在常数时间内执行,或O(1)。控制这个常量时间操作的“for”循环在i = 1时初始化,i通过乘以2迭代,直到它等于或大于n。因此,这个循环将运行次数,运行时间为O(log(n))
示例问题21:程序分析
考虑下面的代码:
代码的运行时间是多少(用大o表示法?)
这段代码的运行时间最好通过插入数字进行分析。以bar(2)的值为例。Bar(2)会导致对Bar(1)的两次调用,而Bar(1)又会导致对Bar(0)的四次调用。对bar(4)的调用将导致对bar(3)的两次调用,对bar(2)的4次调用,对bar(1)的8次调用,以及对bar(0)的16次调用。因此,可以表明调用的数量与2^n成正比,并且运行时间为O(2^n)。
例子问题1:比较运行时间
考虑下面的代码:
代码的预期运行时是多少(用大o符号?)
运行时的最佳分析方法是逐行分解代码。迭代sum值的行在常数时间内执行,或O(1)。这个常数时间操作在for循环中执行n次,导致运行时间与n成正比,或O(n)。
例子问题1:比较运行时间
考虑下面的代码:
代码的预期运行时间是多少(用大o表示法?)
运行时的最佳分析方法是逐行分解代码。迭代sum值的行在常数时间内执行,或O(1)。这个常数时间操作在内部的for循环中执行n次,在外部的for循环中执行n次。因此,运行时间为.
例子问题1:比较运行时间
考虑下面的代码:
代码的运行时间是多少(用大o表示法)?
运行时的最佳分析方法是逐行分解代码。迭代sum值的行在常数时间内执行,或O(1)。执行这个常数时间操作在内部的“for”循环中,和外部循环中的Times。因此,总体运行时间为.
例子问题2:算法分析
下面这个函数的BigO是多少?
bigO(int[][] m)
{
If (m.length > 2)
{
For (int I = 0;I < m.length - 1;我+ +)
{
For (int j = 0;J < m[i].length;j + +)
{
System.out.println (m[我][j]);
}
}
}
其他的
{
For (int j = 0;J < m[0].length;j + +)
{
System.out.println (m [0] [j]);
}
}
}
O (n)
O (1)
O (log (n))
O (n2)
O (n * log (n)
O (n2)
函数是O(n2),因为它有一个大小为2的嵌套循环,没有额外的附加内容可能会添加到log(n)中。一个好的经验法则是:如果有嵌套循环,那么BigO通常是O(n)米),其中m为最长部分的循环级别。
例子问题1:比较运行时间
哪个更有效(即更低的大O)?
1)
Arr = [1,2,3,4,5,6,7,8]
arr2 =[[1、2],[3,4],[5,6],[7,8],[9 10],[10 11]]
For (int I = 0;I < arrr .length;我+ +){
For (int j = i;J < arr2.length;j + +) {
Arr [i][j] = 0;
}
}
2)
Arr = [1,2,3,4,5,6,7,8]
arr2 =[[1、2],[3,4],[5,6],[7,8],[9 10],[10 11]]
For (int I = 0;I < arrr .length;我+ +){
For (int j = 0;J < arr2.length;j + +) {
Arr [j] = 0;
}
}
大O是等价的
2
1
无关紧要的
2
代码示例#1依赖于第二个循环中的i,其中int j = i。由于代码依赖于第二个循环中的i,因此顺序从O(N)到O(N)2)
代码示例#2有两个互不依赖的独立循环。第一个for循环遍历数组arr,第二个for循环遍历数组arr2。因为两个循环是互斥的,所以顺序是O(N)
例子问题1:比较运行时间
哪个编译时间更快,O(N) O(N2), O (N3.),或O(NlogN)?
O (N3.)
O (N)
O (NlogN)
O (N2)
O (N)
O(NlogN) = O(N) * O(logN)大于O(N)单独。
O (N2)为O(N*N),大于O(N)。
O (N3.)为O(N*N*N),大于O(N)。
O(N)是最小的,因此是最快的编译。因此,O(N)是正确答案。
例子问题1:比较运行时间
哪个更有效率?
一)
Arr = [0,1,2,3]
For (int I = 0;I < arrr .length;我+ +){
Int j = 0;
If (j == arr[i]) {
+ +;
}
}
b)
ArrayList
arL.add (0);
arL.add (1);
arL.add (2);
arL.add (3);
For (int I = 0;i < arL.size();我+ +){
Int k = 0;
if (k == arL.get(i)) {
k + +;
}
}
b)
一)
数组比数组列表更有效
A)和b)具有相同的效率
A)和b)具有相同的效率
这两个代码段具有相同的效率。两者都在O(N)时间内运行。数组列表使用数组作为其底层数据结构,因此对数据的访问也是相同的。
例子问题1:比较运行时间
对或错。
代码段A的运行时间比代码段B更有效。
(一)
For (int I = 0;I < 25;我+ +){
For (int j = i;J < 25;j + +) {
}
}
(B)
For (int I = 0;I < 25;我+ + {
For (int j = 0;J < 25;j + +) {
}
}
假
真正的
假
代码段A的运行时间为O(N2).代码段B的运行时间为O(N)。虽然这两个代码段可能看起来相同,但代码段A中的第二个for循环设置j=i。因为j依赖于i,所以它将第一个for循环的运行时间乘以第二个for循环的运行时间。得到O(N*N)或者O(N2).