知识点:分治法
章节8.2-8.3。2021、2019年考了。
对时间复杂度书上说的比较少,好像没有说清楚如何计算,在8.2章节算法分析基础里面有一个独立的小章节有相关内容。所以可能只会考察一些算法的时间复杂度的记忆,比如本题。
时间复杂度简单来说就是和主要程序片段要执行的次数有关,比如n次for循环,每一次都打印一个语句,那么只计算执行打印的次数,不计算给i赋值、控制循环i++等执行次数。另外如果一个n次的for循环里面有嵌套的n次的for循环,在外层for循环执行完毕后,又执行第三个独立的for循环,就只需计算第一个for循环的打印次数,也就是nxn也就是n的平方,后面的第三个+n就不看它了,因为它是n的1次方,最后结果只管n的最高次方。另外如果n平方前面还有一个常数系数的话,系数也要取消。
然后加个O(次数);这样就表示时间复杂度。比如查看n个数字的冒泡算法的代码,它有两层for循环(大概是每一个元素都和所有元素都发起一次比较,所以大概比较次数就是n平方),所以粗略的计算它的时间复杂度就是O(n²)。
---
其实题目中描述的算法就是章节8.3的分治法,分治法的实例之归并排序的三个步骤:分解(一半)、求解、合并,时间复杂度:O(nlogn)。
分治法两个实例:归并排序,也就是分成两半,排序。另一个是最大字段和,也就是本题所说的问题。时间复杂度同上,所以本题选A。
后面大概还有6个算法需要掌握(分治法考了一次,下一次应该要考另一个算法了):动态规划法(2019、2018)、贪心法(2021、2019、2018)、回溯法(2019、2018、2017)、分支界限法、概率算法、近似算法、等等。