寻找最大元素的时间复杂度分析

时间:2015-06-12 21:31:14

标签: algorithm big-o time-complexity lower-bound

我遇到了一个家庭作业问题:

  

其中哪一个是最优算法的最佳运行时间的渐近紧上限,该算法在大小为n的任意整数数组中找到最大元素

     
      
  1. O(log n)
  2.   
  3. 为O(n 2
  4.   
  5. O(n)的
  6.   
  7. O(1)
  8.   
  9. O(n log n)
  10.   

根据我的理解,它是O(n),因为即使它是我们仍然需要的最好的情况 扫描arr以获得结果。请纠正我

2 个答案:

答案 0 :(得分:2)

是的,这是正确的。一种看待这种情况的方法是通过对抗性论证。假设您有一个算法,据称可以在数组中找到最大值,但不会检查每个数组元素至少一次。

假设我在一些数组A 1 上运行你的算法,该数组除了数字0之外什么都没有。因为你的算法没有查看数组中的所有位置,所以它有一些位置它没有看着;叫那个位置k。现在,将A 2 定义为与数组A 1 相同的数组,除了定义A 2 中位置k处的元素是1。

现在,如果我在A 2 上运行算法会怎样?由于你的算法从未在A 1 中查看位置k而A 2 与A 2 相同,除了位置k,你的算法不能分别告诉A 1 和A 2 。因此,无论它对A 1 所说的内容必须与它对A 2 所说的相同。

但这是一个问题。如果你的算法说最大值是0,那么A 2 是错误的,其最大值是1.如果你的算法说最大值是1,那么A 1就错了,其最大值为0.因此,算法在至少一种情况下必须是错误的,因此它不能是找到最大值的正确算法。

这个论点表明,任何始终在数组中找到最大值的确定性算法都必须查看该数组中的所有位置,因此运行时必须是Ω(n)才能正确。

希望这有帮助!

答案 1 :(得分:1)

如果我们对数组中的数据一无所知,则O(n)是运行时间。在你的情况下,这是真的。 "任意大小为n&#34的整数数组;意味着它可以是任何整数数组。

阵列排序时可以使用O(1)。 如果我们首先使用quicksort对数组进行排序然后选择最大的项目,则可以使用O(nlog n)。 如果我们首先使用bubblesort对数组进行排序,然后选择最大的项目,则可以使用O(n ^ 2)。