Java 包含两个迭代器变量的数组的两部分的单个while循环的大Oh表示法

Java 包含两个迭代器变量的数组的两部分的单个while循环的大Oh表示法,java,algorithm,big-o,Java,Algorithm,Big O,为了复习我在考试中对大O的理解(很明显,这是一个非常基本的大O理解),我在书中做了一些练习题 他们给了我以下的片段 public static void swap(int[] a) { int i = 0; int j = a.length-1; while (i < j) { int temp = a[i]; a[i] = a[j]; a[j] = temp; i++; j-

为了复习我在考试中对大O的理解(很明显,这是一个非常基本的大O理解),我在书中做了一些练习题

他们给了我以下的片段

public static void swap(int[] a)
{
    int i = 0;
    int j = a.length-1;

    while (i < j)
    {
        int temp = a[i];
        a[i] = a[j];
        a[j] = temp;
        i++;
        j--;
    }
}
公共静态无效交换(int[]a)
{
int i=0;
int j=a.长度-1;
而(i
我觉得很容易理解。它有两个迭代器,每个迭代器用固定的工作量覆盖数组的一半(我认为这两个迭代器的时钟都是O(n/2))

因此O(n/2)+O(n/2)=O(2n/2)=O(n)

现在请原谅,因为这是我目前的理解,这是我试图解决问题的方法。我在网上找到了很多big-o的例子,但没有一个是这样的,迭代器基本上同时增加和修改数组

它有一个循环的事实让我觉得它是O(n)

谁能帮我把这件事弄清楚吗

谢谢

它有一个循环的事实让我觉得它是O(n)

这是正确的。这并不是因为它正在生成一个循环,而是因为它是一个由常量因子决定数组大小的循环:big-O表示法忽略任何常量因子
O(n)
表示对算法的唯一影响是基于数组的大小。这实际上需要一半的时间,这对big-O来说并不重要

换句话说:如果您的算法需要时间,
n+X
Xn
Xn+Y
将全部归结为big-O
O(n)

如果循环的大小不是常数因子,而是作为
n
的对数函数或指数函数而改变,则情况会有所不同,例如,如果大小为
100
,循环为
2
,大小为
1000
,循环为
3
,大小为
10000
,循环为
4
。在这种情况下,例如,
O(log(n))

如果循环与大小无关,则情况也会有所不同。也就是说,如果你总是循环
100次
,不管循环大小如何,你的算法将是
O(1)
(也就是说,在某个恒定的时间内运行)

我还想知道我得出的方程式是否正确


对。事实上,如果你的方程最终是某种形式的
n*C+Y
,其中
C
是常数,
Y
是其他值,那么结果就是
O(n)
,不管see是大于
1
,还是小于
1

关于循环,你是对的。循环将确定大O。但是循环只运行阵列的一半

所以是这样2+6*(n/2)

如果我们把n设得很大,其他的数字就很小了。所以他们不重要。 所以是O(n)

假设您正在运行两个独立的循环2+6*(n/2)+6*(n/2)。在这种情况下,它将再次是O(n)

但如果我们运行嵌套循环2+6*(n*n)。那么它将是O(n^2)


始终删除常量并进行计算。你知道了。

j-i
在每次迭代中减少
2
单位时,取其中的
N/2
(假设
N=length(a)


因此,运行时间确实是
O(N/2)
。而
O(N/2)
严格等同于
O(N)

谢谢您的回复。我还想知道我得出的方程式是否正确。这样从数学角度来思考它是有帮助的,但我只是在黑暗中尝试一下。在这方面进行一些验证将是非常好的。我假设它是
O(n/2)+O(n/2)或者仅仅是O(n/2),然后我忽略了/2,所以让我很快地分解它。每一次迭代需要2个初始操作+6个操作乘以总迭代次数?您使用
O(2n)
的示例仍然以
O(n)
结束,因为它仍然单独依赖于大小。否则,如果两个循环产生不同的结果,半个循环也应该产生不同的结果,用大O表示法。对,我错了。2也是一个常数。那没关系。如果这个数字非常大,那么,2+6(n/2)真的有那么大的估计值吗?我认为线性中断是瓶颈,因此算法O(n/2)取决于跳跃/分叉的数量。对于O来说,这无关紧要,但一般来说,对于估计值来说,常数6并不合适,因为您不知道独立操作的执行时间,这些操作依赖于机器。你可以根据变量赋值的数量进行推理,这无疑是每次迭代5次(
i++
i+=1
的缩写)。仅供参考:即使你只迭代了半个数组,比如说
sumoddinexelements()
,它仍然是O(n)。1/2的常数因子消失了。当您开始分析更复杂的算法时,在分析的早期从精确计数切换到大O是很有帮助的。然后中间步骤变得更简单,因为您可以丢弃术语。也就是说,如果一个子例程做O(n)+O(logn)的工作,你可以立即将其减少到O(n)来进行其余的分析。@Japreis对不起,我不想以任何方式重复,但你的最后一句话让我有点困惑。如果我理解正确的话,O(logn)将变得微不足道,以至于O(n)在某一点不值得计算到时间效率中,因此我们放弃它?根据大O的定义,当你添加项时,你总是可以放弃一切,但渐近最大的项除外。你可以证明
n+logn<2n
但是
2n
是O(n)。所以是的,在一个非常好的环境中,它是无关紧要的