繁体   English   中英

推导函数的时间复杂度

[英]Deriving time complexity of a function

下面的程序用于搜索正整数的二维正方形数组,其中按非降序对行和列进行排序。 如果目标(值)元素存在于数组中,则程序返回true,否则返回false。 我需要为此任务设计算法,该算法将尽可能高效。 我写了这段代码,但是我不知道如何使用求和来得出最坏情况下的运行时复杂度函数。 我假设我的解决方案在最坏的情况下是O(n)阶。 但我不知道如何用数学方式显示(使用求和等)。

撇开实际的代码来看,最糟糕的情况可能是一个二维数组,其中一个维的大小仅为1,因此就像一个具有100列和1行的数组。 然后,如果要最大数量,则将数组中元素总数的N阶移到末尾。

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

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

好吧,我们正在讨论上限 (这是O( f (N))的度量),因此我们正在讨论最坏的情况。 这意味着遍历整个数组。

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

使用汇总显示它……好吧,在不失去一般性的情况下,您将执行一系列跨步骤的操作,然后执行一系列向下的步骤(或对它们进行一些重新排序),这使您付出了以下代价:

K 跨度 ×N 跨度 + K 向下 ×N 向下 + K 帖子

(这很简单)。 但是所有这些恒定的K blah位在big-Oh分析中都会丢失,从而为您提供O(N cross + N down ),对于正方形阵列,其简化为O(2×N)(其他形状的值略有不同),因此简化为O (N)。 仅当其中一个维度是另一个维度的超线性函数时,您才能获得其他成本函数,但这很奇怪。

推导成本函数的关键见解是知道您必须遍历整个数组,但是您只是沿其( 曼哈顿风格 )走过,而不是访问每个单元。

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

首先找出最坏的情况。 就像x + y + x或2x + y。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM