Java I';我和大O混淆了
我正在努力为今晚到期的一个项目的一部分掌握大O的想法,我不知道我是否正确地考虑了这个问题 该项目包括我们编写数学运算的迭代和递归解决方案 下面是一些方法Java I';我和大O混淆了,java,big-o,Java,Big O,我正在努力为今晚到期的一个项目的一部分掌握大O的想法,我不知道我是否正确地考虑了这个问题 该项目包括我们编写数学运算的迭代和递归解决方案 下面是一些方法 public int inc(int n) { n = n + 1; return n; } public int dec(int n) { n = n - 1; return n; } public int add(int lhs, int rhs) { int sum = lhs; wh
public int inc(int n)
{
n = n + 1;
return n;
}
public int dec(int n)
{
n = n - 1;
return n;
}
public int add(int lhs, int rhs)
{
int sum = lhs;
while (rhs > 0) {
sum = inc(sum);
rhs = dec(rhs);
} // while
return sum;
}
public int fac(int num)
{
int ans = num;
while(num > 1)
{
ans = mul(ans, dec(num));
}
return ans;
}
public int div(int lhs, int rhs) throws ArithmeticException
{
int quot = 0;
while (lhs > 0)
{
lhs = sub(lhs,rhs);
if(lhs < rhs)
{
quot = 0;
}
else
{
quot = inc(quot);
}
}
return quot;
}
public int lshift(int lhs, int rhs)
{
return mul(lhs,pow(2,rhs));
}
我将只留下一个递归示例,除非有人要求其他示例。if和else if应分别被视为恒定时间,对吗?然后返回调用了所有其他递归方法,以及它本身(显然),我真的不知道从哪里开始
有人能简单地解释一下吗
编辑:添加了Pow
public int pow(int lhs, int rhs)
{
int ans = lhs;
for(int i = rhs; i > 1; i--)
{
ans = mul(ans,lhs);
}
return ans;
}
Big Oh背后的理念是,它是特定算法的平均运行时间。在分析运行时时时,您需要查找关键内容,例如:
- 正在使用的参数与使用它执行的操作之间的关系
- 代码的“关键部分”与传入的参数之间的关系
和inc
都是恒定时间。它们不再需要依赖于传入的参数的大小来执行dec
绑定到add
的大小,因为rhs
中的每个值都会递增一步。所以运行时是O(n)*rhs
- 根据递归示例,
,有三种情况:两种基本情况和一种迭代情况。基本情况被假定为在恒定时间内运行,但由于存在迭代情况,它超过了基本情况的运行时间 在这种情况下,您受到传入的mul
大小的限制,因此它将在O(n)时间内运行rhs
绑定到传入的fac
的大小。它将是O(n)运行时num
绑定到div
,它将处于O(n)运行时lhs
*:谈论一种添加两个数字的奇怪方法…
inc
和dec
都是O(1),因为它们总是可以在固定数量的操作中完成,并且它们不依赖于作为参数传递的值
<代码> Addio>代码,例如,根据您传递的参数作为参数,所以如果我们认为这个数字是我们的“订单”,<代码> Addio/Cuth>是O(n)。p> 简单地说:作为参数传递的值越高,需要执行的操作就越多。 因为这个增加是线性的(大致上,如果你增加100,你将有一个相同数量级的操作增加)
您的mul
实现也将在O(n)时间内运行,因为这是您拥有的更“昂贵”的操作的成本,add
您需要理解的是Big-O表示法的含义:算法的运行时间与输入大小变化之间的关系
如果你记住这一点,你将更容易计算出方法的成本。你检查过吗?检查这个清楚的答案检查这个清楚的答案,这个答案以前被问过很多次
mul
方法实际上有一个最佳情况下的运行时O(1)和一个最坏情况下的运行时O(n)。在比较排序算法时,理解运行时复杂度可能因数据而异的概念将非常重要(通常是学生在学习算法复杂度时要做的下一件事)(是的,非常奇怪的添加方式!!),因此为了确保我理解这一点。。。那么调用其他方法总是被认为是固定时间?那么我的lshift方法也会被认为是常数时间吗?不一定。这实际上取决于该方法正在做什么。打电话并不意味着它是固定时间。仔细检查基本情况、迭代情况和关键部件操作。具体地说,我不能告诉你,因为我不知道pow
将如何运行,但它肯定是rhs
。好吧。。。那么你能解释一下lshift方法吗?我是否需要考虑从另一个方法中调用的方法中的大O?(顺便说一句,你帮了大忙!)编辑:是的,你必须考虑他们的行为,但只有在你添加更多工作时。通过查看pow
,对于每个对mul
的调用,您将在pow
中执行lhs
操作。因此,运行时间很可能是O(n^2)。
public int pow(int lhs, int rhs)
{
int ans = lhs;
for(int i = rhs; i > 1; i--)
{
ans = mul(ans,lhs);
}
return ans;
}