计算学校的时间复杂度

时间:2018-04-04 18:51:26

标签: java time time-complexity

我正在学习时间的复杂性,我被要求写这个方法: public static boolean findValWhat(int [] [] m,int val) 检查是否存在于m中的val,并且该方法必须在O(n)时间运行,而“n”表示数组中的行。它甚至可能还是合乎逻辑的?

1 个答案:

答案 0 :(得分:2)

您没有说明您的方法必须做什么。如果未指定,则只需编写一次访问每列一次的方法(如打印每列中的第一个条目)。

如果您的列具有固定数量的行(或者您只是访问每列的固定行数),您可以访问表中的每个条目,因为它将始终以每列相同的量增长(使其成为线性)。

我支持,如果你想制作一个O(N)和HAD的方法来访问每个条目它可以通过浪费时间使短列长度与长列一样长(这是一个奇怪的概念,它伤害了我的头)

编辑:

教师可能想要的一个答案就是在所有行上使用一个循环来完成。这可以通过将每行加载到哈希集中然后在哈希集中查找值来完成。这不是O(n)(它最好是O(n log n))但它只有一个循环而且从一个天真的角度来看可能有资格作为O(n)。

但是,奇怪的是,如果你总是传递一个具有相同列数的数组,那么任何解决方案都将是O(n),但是需要嵌套循环!这似乎是违反直觉的,但如果我是一名教师并希望证明复杂性测量并不是真正意义上的话,那么我可能会这样做。 (因为O(n)没有说n需要多长时间!可能每个n都是1小时,但只要n = 2需要2小时,n = 4需要4小时它仍然是O(n))

编辑:

我不确定你的老师到底是怎么回事。如果存在恒定数量的列,那么循环将用于(... i< n ..){for(... i< c ..))如果c是常数,则n的增加将是线性的甚至是线性的我相信第二个循环,但这有点棘手。

我能想到的另一件事是他们正在寻找类似的东西:

Create a HashSet

for(.. i < nRows ..)
{
   add each row to HashSet...
}

return haseset.contains(val);

现在这个解决方案实际上是o(n ^ 2)我认为(抛出O(log n)以获得良好的度量),但由于它只有一个VISIBLE循环,它可能看起来像o(n)

所以我不确定你的老师到底是怎么回事。

这是另一件看起来像O(n)的东西:

Arrays.stream(m).flatMapToInt(x -> Arrays.stream(x)).forEach(
    a->if(a == val...));

当你的老师告诉我他们的目标时,我很想知道。