求最大公约数,二分查找法

来源:互联网 发布:js中单引号双引号 编辑:程序博客网 时间:2024/06/14 15:13

最近买了两本有关数据结构和算法的书来研,打算好好重新学习一下,毕竟技术随着时间的推移是可能被慢慢淘汰的,而算法是那些技术实现的根基。

算法是是计算机解决问题的方法,高效的算法能让计算机更快的解决问题。



欧几里得算法求最大公约数:

计算两个非负整数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;}



0 0
原创粉丝点击