最近买了两本有关数据结构和算法的书来研,打算好好重新学习一下,毕竟技术随着时间的推移是可能被慢慢淘汰的,而算法是那些技术实现的根基。
算法是是计算机解决问题的方法,高效的算法能让计算机更快的解决问题。
欧几里得算法求最大公约数:
计算两个非负整数p、q的最大公约数:如果q=0,则最大公约数是p,否则,将p除以q,得到余数r,p、q的最大公约数等于p与r的最大公约数。
因此,我们通过计算机代码来实现:
/**欧几里得算法,求最大公约数
* 求两个非负整数的最大公约数
* @param num1
* @param num2
* @return
*/
public static int gcd(int num1,int num2){
if(num2 == 0){
return num1;
}
int r = num1 % num2;
return gcd(num1, r);
}
二分查找法:
当我们要在一个有序的序列中找到一个数,我们可以通过二分查找法,这样可以有效减少查询次数。
,如果我们只是通过一个个遍历来查找,这样效率就会下降很多。
图解:
/**
* 二分法求下标 ,要求数组是有序的
* @param key
* @param numbers
* @return
*/
public static int getIndex(int key,int[] numbers){
int startIndex = 0;
int endIndex = numbers.length - 1;
while(startIndex <= endIndex){
int midIndex = (startIndex + endIndex)/2;
if(key > numbers[midIndex]){
startIndex = midIndex + 1;
}else if(key < numbers[midIndex]){
endIndex = midIndex - 1;
}else{
return midIndex;
}
}
return -1;
}
/**
* 低效率的实现
* @param key
* @param numbers
* @return
*/
public int getIndexLow(int key,int[] numbers){
for(int i = 0;i < numbers.length;i++){
if(key == numbers[i]){
return i;
}
}
return -1;
}