导出函数的时间复杂度

时间:2011-11-28 23:41:02

标签: java

以下程序用于搜索具有非递减顺序的排序行和列的正整数的二维正方形数组。如果target(value)元素存在于数组中,则程序返回true,否则返回false。 我需要为这项任务设计算法,尽可能高效。 我写了这段代码,但我不知道如何使用求和导出最坏情况的运行时复杂度函数。我假设在最坏的情况下我的解决方案是订单O(n)。但我不知道如何以数学方式显示它(使用求和等)。

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

在每次迭代中,x减少或y增加。在最坏的情况下,我们不会在x == 0y == n-1之前终止循环。因此,我们从右上角(假设我们从x == n-1y==0开始)走到左下角。

假设数组大小为n - by - n,那么这将需要2n次迭代,最坏情况。因此,这是O(n),最坏情况。

答案 2 :(得分:0)

好吧,我们正在谈论界限(这就是O( f (N))测量的)所以我们谈的是最坏的情况。这意味着遍历整个阵列。

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

使用汇总显示它......好吧,不失一般性,你会做一堆跨步骤,然后是一堆向下步骤(或对它们进行一些重新排序),这会给你带来以下成本:

K 跨越×N 跨越 + K down ×N down + K post

(这非常简单)。但所有那些常数K blah 位在big-Oh分析中丢失,给出O(N + N down ),这简化为O (2×N)用于方形阵列(其他形状的值略有不同),因此为O(N)。当其中一个维度是另一个维度的超线性函数时,您只能获得其他成本函数,但这是相当奇特的。

导出成本函数的关键见解是知道你必须遍历整个数组,但你只是在它上面采用(Manhattan-style)路径而不访问每个单元格。

答案 3 :(得分:-1)

由于多维数组实际上是一维数组的另一种形式(其中n = x * y),因此这是O(n)的顺序。它将搜索的元素总数将小于该数量,但仅限于一小部分。即使它是一个很大的部分,这仍然被认为是O(n)。

首先找出最糟糕的情况。这可能是x + y + x或2x + y。