【问题标题】:Maximum subarray - runtime最大子数组 - 运行时
【发布时间】:2012-03-10 21:32:49
【问题描述】:

我目前正在分析 maximum subarray problem 的蛮力算法和分治算法(递归)。

使用蛮力算法,最坏情况的运行时间是 O(n^2)。 使用递归算法,最坏情况的运行时间为 O(n*log(n))。

但是对于直到某个常数(例如 k)的小输入,蛮力实际上更快,所以我想使用直到 k 的蛮力,然后再递归。

我不确定如何分析这个,即使用参数 n 和 k。 (插入/合并排序也有类似的问题,它需要 O(k^2*(n/k))=O(n*k),所以我想我可以使用相同的结果但是......)。


让我尝试重新表述,并使用 theta 表示法。

“在递归中使用蛮力算法的渐近运行时间是多少(使用 n 和 k 作为参数),其中蛮力比递归快到 k = 50。”

我必须同时包含参数 n 和 k,而递归树是我们迄今为止测试这些问题的唯一主题。

【问题讨论】:

  • Kadane 的算法有什么问题?

标签: algorithm big-o max


【解决方案1】:

请记住,big-O 谈到算法的长期增长率。形式上,它表示对于足够大的 n,一个函数的行为小于另一个函数的某个常数倍数。这意味着,如果您确定常数 k 的任何选择,然后对 n ≤ k 使用 O(n2) 算法,对所有 n > k 使用 O(n log n) 算法,总体运行时间将是 O(n log n),因为随着 n 增长到足够大,算法的行为完全取决于 O(n log n) 算法的行为。

也就是说,您应该研究Kadane's algorithm,这是一种使用dynamic programming 在O(n) 时间、O(1) 空间内解决此问题的算法,并且只需遍历数组一次。它几乎肯定会比您的任何一种方法都更快(实际上和渐近)。

希望这会有所帮助!

【讨论】:

  • 蛮力是 O(n^2)。但是对于足够小的输入,它不是 O(n^2),因为它比递归更快。
  • @user1261561- 短语“小输入的 O(n^2)”在这里没有真正意义。 Big-O 必然描述长期增长率,完全忽略了小投入的行为。
猜你喜欢
  • 2012-06-25
  • 2016-03-15
  • 1970-01-01
  • 2015-02-09
  • 1970-01-01
  • 2016-01-13
  • 2019-11-20
  • 2017-12-28
  • 2018-08-17
相关资源
最近更新 更多