Java 推导函数的时间复杂度

Java 推导函数的时间复杂度,java,Java,以下程序用于搜索按非降序排列的行和列的二维正整数平方数组。如果数组中存在目标值元素,则程序返回true,否则返回false。 我需要为这项任务设计尽可能高效的算法。 我写了这段代码,但我不知道如何使用求和推导最坏情况下的运行时复杂度函数。我假设我的解决方案在最坏的情况下是有序的。但是我不知道如何用求和等数学方法来表示它。把实际代码放在一边,最坏的情况可能是二维数组,其中一个维度的大小只有1,就像一个有100列和1行的数组一样。然后,如果你想要最大的数字,它是数组中元素总数的N阶,走到最后。因为多

以下程序用于搜索按非降序排列的行和列的二维正整数平方数组。如果数组中存在目标值元素,则程序返回true,否则返回false。 我需要为这项任务设计尽可能高效的算法。
我写了这段代码,但我不知道如何使用求和推导最坏情况下的运行时复杂度函数。我假设我的解决方案在最坏的情况下是有序的。但是我不知道如何用求和等数学方法来表示它。

把实际代码放在一边,最坏的情况可能是二维数组,其中一个维度的大小只有1,就像一个有100列和1行的数组一样。然后,如果你想要最大的数字,它是数组中元素总数的N阶,走到最后。

因为多维数组实际上是一维数组的另一种形式,其中N=x*y,这是On的顺序。它将搜索的元素总数将小于此值,但仅为小数。即使它是一个很大的分数,这仍然被认为是一个问题


首先,找出最坏的情况。这类似于x+y+x或2x+y。

在每次迭代中,要么x减小,要么y增大。在最坏的情况下,直到x==0和y==n-1,我们才终止循环。因此,假设从x==n-1和y==0开始,我们从右上角走到左下角

假设数组的大小为n×n,那么最坏情况下需要2n次迭代。因此,这是最坏的情况。

好吧,我们讨论的是上限,这是OfN衡量的,所以我们讨论的是最坏的情况。这意味着遍历整个数组

如果我们检查这个算法,我们会发现它在数组中穿过一条路径,没有回溯:x永远不会增加,y永远不会减少,我们永远不会在一个点上旋转。这意味着时间成本在数组维数的总和上是线性的:ON+M。对于正方形数组或任意数组,其中任一维数是另一维数的固定倍数,通过常数因子去除简化为ON

使用求和来显示它……好吧,在不失去一般性的情况下,您将执行一系列跨步骤,然后执行一系列下行步骤,或者对它们进行重新排序,这会给您带来以下成本:

Kacross×Nacross+Kdown×Ndown+Kpost

那是很琐碎的。但所有这些常数Kblah位在大Oh分析中都会丢失,这会导致ONacross+Ndown,对于方形阵列,这会简化为O2×N,对于其他形状,其值略有不同,因此会继续。只有当其中一个维度是另一个维度的超线性函数时,才能得到其他成本函数,但这很奇怪


导出代价函数的关键是要知道必须遍历整个数组,而只是在数组上走一条路,而不是访问每个单元格。

这段代码没有太多意义。x==0和y==n-1测试是冗余的;您已经在while条件下对它们进行了测试。如果n是数组中的元素总数,则此函数为Osqrtn。最坏的情况是,程序遍历外部数组中的整个第一个集合,然后爬到内部,然后必须找到最后一个内部数组的第一个元素。然后你可以展示这是怎样的2x+y,你必须用一些非数学语言来做。@OliCharlesworth:我看不出来。你是怎么得出这个结论的?@Godwin:在每次迭代中,你要么向左走,要么向下走。假设从右上角开始,最坏的情况是直到到达左下角才终止,假设是方形阵列,需要2.sqrtn步。那么,在这种情况下,最坏的情况是什么?我假设最坏的情况是元素不存在上界!=最坏的情况。@Oli:你是说最坏的情况不是上限?那是…小说。毕竟,如果上界大于最坏情况,那么一定有一个比最坏情况更坏的情况,这是不可能的……我认为大O并不意味着最坏情况。您可以有big-O最佳情况复杂度、big-O平均复杂度或big-O最坏情况复杂度。或者上界小于最坏情况,这更可笑。@Oli:上界是代价函数的最坏情况。然而,可以施加额外的侧面条件来缓解这种情况,例如,在进行快速排序时通常选择“良好”的枢轴,尽管这些侧面条件应始终予以说明。