我目前正在分析 maximum subarray problem 的强力算法和分治算法(递归)。
使用强力算法,最坏情况运行时为O(n ^ 2)。 使用递归算法,最坏情况运行时为O(n * log(n))。
但是对于小输入而言,蛮力实际上更快到达某个常数,比如k,所以我想用蛮力到k,然后再递归。
我不确定如何分析这个,即使用参数n和k。 (对于插入/合并排序有一个类似的问题,它需要O(k ^ 2 *(n / k))= O(n * k),所以我认为我可以使用相同的结果,但......)。
让我尝试重新制定,并让我们使用theta-notation。
“在递归中使用暴力的算法的渐近运行时间是什么(使用n和k作为参数),其中蛮力比递归到k = 50更快。”
我必须在其上包含参数n和k,并且递归树是我们迄今为止测试这些问题的唯一主题。
答案 0 :(得分:3)
请记住,大O谈论算法的长期增长率。形式上,它表示对于足够大的n,一个函数的行为小于另一个函数的某个常数倍。这意味着如果你修复常数k的任何选择,然后对n≤k使用O(n 2 )算法,对所有n>使用O(n log n)算法。 k,整个运行时将是O(n log n),因为当n增长到足够大时,算法的行为完全取决于O(n log n)算法的行为。
那就是说,你应该研究Kadane's algorithm,这是一种算法,它使用dynamic programming在O(n)时间,O(1)空间中解决这个问题,并且只是一次通过数组。几乎可以肯定,它比你的任何一种方法都要快(无论是实际的还是无意义的)。
希望这有帮助!