使用2D值计算bigO运行时,其中一个维度具有未知长度

时间:2016-08-26 18:48:58

标签: big-o

我正在研究water-collection between towers problem,并尝试计算我的练习解决方案的重要内容。

有一次,我从用户输入的高度阵列构建了一个“塔”的2D阵列。此步骤使用嵌套for循环,其中内循环多次运行height

这个步骤的BigO是n * maxHeight吗?

我从来没有见过任何使用这样的变量的BigO,但是我又很新,所以这可能是一个经验问题。

我不认为高度问题可以作为常数注销,因为没有理由认为塔的高度不会定期超过塔的数量。

  //convert towerArray into 2D array representing towers
var multiTowerArray = [];
for (i = 0; i < towerArray.length; i++) {
  //towerArray is the user-input array of tower heights
    multiTowerArray.push([]);
    for (j = 0; j < towerArray[i]; j++) {
        multiTowerArray[i].push(1);
    }
}

1 个答案:

答案 0 :(得分:2)

对于初学者来说,根据输入中元素的 number 以及<给出一段代码的大O运行时间是完全合理的 - 并非不常见 - 输入中元素的em> size 。例如,counting sort在时间O(n + U)中运行,其中n是输入数组中元素的数量,U是数组中的最大值。所以是的,你绝对可以说代码的运行时是O(nU),其中n是元素的数量,U是数组中任何位置的最大值。

另一种选择是说代码的运行时是O(n + S),其中S是数组中所有元素的总和,因为内部循环运行的总次数等于数组元素的总和。

一般来说,您可以根据自己喜欢的数量来表达算法的运行时间。许多图算法的运行时间取决于节点数(通常表示为n)和边数(通常表示为m),例如Dijkstra算法,可以使其在时间上运行O(m + n log n)使用Fibonacci堆。某些算法的运行时间取决于输出的大小(例如,Aho-Corasick string matching algorithm在时间O(m + n + z)中运行,其中m和n是输入字符串的长度,z是匹配数)。一些算法依赖于许多其他参数 - 例如,count-min sketch在时间O(ε -1 logδ -1 )中执行更新,其中ε和δ是算法启动时指定的参数。