这篇内容不多,质量不大高
循环在针对一些问题时,的确是很快能想到的方法,一般也是比较暴力的一个个的尝试,而这不就是计算机擅长的事吗?
不过有时规模非常大时,计算机也需要一些时间去计算,对于一些密码或者以指数规模增长的问题(或者NP完全问题),只是用循环一个个去试,有时并不一定能得到想要的结果,反而看起来还笨一些
那么有两种选择:
一是对现有的循环进行优化,降低它的时间复杂度
二是不用循环,考虑其他方法,或许其他方法更巧妙,更有效
如何优化一个n重循环?
这个暂时没有太多积累,这要看这n重循环用来干什么,这n重循环是对几个对象进行循环
(一) n重循环只针对一个对象,要的元素都在该对象中,要的元素彼此间有具体的数学关系
一次优化:
如果要拿出n个元素就需要进行n重的循环,
那么对于其中一个元素n[i],就可以根据其给出的具体的数学关系求出
这样少用一个循环,用其他元素求出该元素后在所在对象中使用二分搜索查找
【二分搜索的前提是该对象有序排列,这样这一步的时间复杂度就为 O(logn)】
剩下的n-1重循环就会因为少了一重循环而少一个数量级
最终的时间复杂度为O(n^n-1*log(n))
二次优化:
再根据上面的方法再来一遍,拿出两个元素
这样就用n-2重循环,这两个元素可以用其他的元素由具体的数学关系求出
对于这两个元素,其间也有相应的数学关系,进行组合后在其对象中搜索
其对象也要根据这两个元素的变化做出相应的变化
【前提依旧是变化后的对象仍然要有序】
这样就剩n-2重循环,又降低了一个数量级
最终的时间复杂度为 O(n^n-2 * log(n))
。。。。。
【待续】