本人算法萌新,对算法还不是有很深的了解。最近在做算法题,总是遇到一些对算法时间复杂度要求很高的题目,所以想问问大家是怎样优化算法,降低复杂度的,不只是局限于for循环。
具体情况具体分析。不同的算法有不同的处理办法,没有一概而论的。
比如说排序,可以从两重循环的n2复杂度降低为nlogn的复杂度。
for 循环不好吗QAQ……
循环展开是优化运算次数的,并不优化复杂度。
FFT 内部还有两重(三重也行,看写法)循环呢……但是复杂度仍然是 O(nlogn) 啊QAQ
匿了
我觉得解决方法就是换个算法。
写算法时最常见的几种时间复杂度不外乎:
(1)O(1)
(2)O(logn)
(3)O(n)
(4)O(nlogn)
(5)O(n^2)
O(n^2)是一个底线,你会发现通常自己写的最符合直觉的方法几乎都是O(n^2),如果时间复杂度更高,常常会吃TLE。
那不妨看看剩下四个时间复杂度:
(1)O(1),一般是单步操作,如果出现在查找,那就是大名鼎鼎的哈希表了。
(2)O(logn),一般和树形结构有关。
(3)O(n),这个比较玄,很难对应到某个结构。非基于比较的排序,如计数排序能达到这么优秀的复杂度。
(4)O(nlogn),一般用树形结构来解决一维数组的问题就会得到这种复杂度。
所以题主。。你需要做的就是熟悉各种数据结构和常用算法,然后往具体的情景上套。。(感觉说了句废话)。。套的时候可以想想自己的目标是什么,然后想想这个目标时间复杂度对应了什么结构或者算法。。
最后扯一句,如果抛开算法不谈只谈循环的话,你可以看看编译原理的书,里面会介绍一种叫“循环优化”的技术。。
希望有用。。