Java I';我和大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

我正在努力为今晚到期的一个项目的一部分掌握大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;    
   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
    的大小,因为
    rhs
    中的每个值都会递增一步。所以运行时是O(n)*

  • 根据递归示例,
    mul
    ,有三种情况:两种基本情况和一种迭代情况。基本情况被假定为在恒定时间内运行,但由于存在迭代情况,它超过了基本情况的运行时间

    在这种情况下,您受到传入的
    rhs
    大小的限制,因此它将在O(n)时间内运行

  • fac
    绑定到传入的
    num
    的大小。它将是O(n)运行时

  • div
    绑定到
    lhs
    ,它将处于O(n)运行时


*:谈论一种添加两个数字的奇怪方法…

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;
}