二进制枚举优化
比如要枚举0->1023中所有的数
我们平常的枚举方法就是:0,1,2,3,4,5,...,1023。这样枚举1024次
使用二进制枚举优化
,就可以只需枚举10次就可以枚举出任意一个数。
将0~1023这1024个数分为10个组,每组分别是:1 2 4 8 16 32 64 128 256 512 这10个数字(2^0 2^1 2^2 ... 2^9)。
在枚举的时候只枚举这10个数字,选或不选。就可以枚举出0~1023中的任意一个数字
证明:
1 2 4 8 16 32 64 128 256 512
第一组(个)数字就可枚举出0~1中的任意一个数字
第一、二组(个)数字就可以枚举出0~3中的任意一个数字
第一、二、三组数字就可枚举出0~7中的任意一个数字
第一、二、三、四组数字就可以枚举出0~15中的任意一个数字
一次类推...
所以这十组数字就可以枚举出0~1023中的任意一个数字
这样,原来需要枚举2^10次方次的枚举就优化到了10次,是一个log级别的优化。
再看如果枚举的是0~70呢?
还是从2^0次方开始分组:1 2 4 8 16 32 64 在64(即2^6)的时候所有数加起来就已经大于70了,显然如果这样来就会枚举到不存在的数(或者说没有要求枚举的数)这样显然是不成立的
所以分组:1 2 4 8 16 32 7
最后一个分组是7 。由来:70-(1+2+4+8+16+32)=7
这样可以枚举到0~70的任何一个数
证明:
1 2 4 8 16 32 7
第一组可以枚举出0~1中任意一个数
第一、二组可以枚举出0~3中任意一个数
第一、二、三组可以枚举出0~7中任意一个数
...
所以这7组数就可以枚举出0~70中的任意一个数。