剪枝一词引自对树木的修剪,即修剪掉不必要的枝叶以调整树冠结构或更新枝叶等。而在算法中,剪枝思想则是避免不必要的操作和搜索,或在结果中修剪不必要的部分以获得更好的效果。
这里举三个不同类型算法的例子,以更好的理解剪枝思想的应用:
质数
剪枝一:最简单的判断n是否为质数的方法是根据其定义判断从2到n-1是否存在其约数,时间复杂度O(n);最常用的判断则是判断从2到sqrt(n)是否存在其约数,时间复杂度O(sqrt(n))
- 剪枝操作:从2到(n-1)剪枝为2到sqrt(n)
剪枝二:判断2之后,就可以判断从3到sqrt(n)之间的奇数了,无需再判断之间的偶数,时间复杂度O(sqrt(n)/2)
- 剪枝操作:从2到sqrt(n)剪枝为3到sqrt(n)之间的奇数
剪枝三:首先看一个关于质数分布的规律:大于等于5的质数一定和6的倍数相邻。例如5和7,11和13,17和19等等;注意反过来是不对的,即和6的倍数相邻的数是质数,如35
证明:令x≥1,将大于等于5的自然数表示如下:
··· 6x-1,6x,6x+1,6x+2,6x+3,6x+4,6x+5,6(x+1),6(x+1)+1 ···
可以看到,不在6的倍数两侧,即6x两侧的数为6x+2