通过思考一张1mm的纸(假设可以无限次折叠),每次折叠厚度翻一倍,折多少次能够有地月距离39万KM那么厚,作者引出指数的概念。
凭直觉也得千儿八百次,答案是39次,的确很震撼。
把这种数字急剧增长的情况称为“指数爆炸”,折纸时的厚度 里面n就是折纸次数。之前接触到的汉诺塔问题的解析式和斐波那契数列都属于指数的范畴。
数学中的指数函数是这样
引出的程序问题:
如在测试中有4个按钮,分别会有两种状态,就会出现2^4 种状态,如果是10个呢?就会有2^10次方种,这就出现了测试难题。
如何解决:
1、暴力求解(穷举)
2、转换(像七桥的故事 图论)
3、没有方法,就分类近似。
4、概率求解
例如:有个数组中有几千个个数字那如何找到1010这个数字,这类似于指数爆炸的反向过程,不能一个一个去比较吧,因此出现了二分查找法
package cn.yccj.basics;
public class ResourceSearch
{
public static void main(String[] args) {
int resource[] = {3,5,11,17,21,23,28,30,32,50,64,78,81,95,101};
System.out.println(binSearch(resource, 0, resource.length - 1, 81));
System.out.println(binSearch(resource, 81));
}
// 二分查找递归实现
public static int binSearch(int resource[],int start,int end,int key){
int mid = (end-start)/2+start;
if(resource[mid]==key){
return mid;
}
if(start>end){
return -1;
}
else if(resource[mid]<key){
return binSearch(resource, mid + 1, end, key);
}else if(resource[mid]>key){
return binSearch(resource, start, mid-1, key);
}
return -1;
}
// 二分查找普通循环实现
public static int binSearch(int resource[],int key){
int mid = resource.length/2;
if(key==resource[mid]){
return mid;
}
int start = 0;
int end = resource.length-1;
while (start<=end){
mid =( end - start)/2+start;
if(resource[mid]<key){
start=mid+1;
}else if(resource[mid]>key){
end = mid-1;
}else {
return mid;
}
}
return -1;
}
}
指数增长的好处:
例子:指数增长与密码关系
加密长度越长,解密更困难