本系列博客習題來自《算法(第四版)》,算是本人的讀書筆記腔丧,如果有人在讀這本書的钝尸,歡迎大家多多交流。為了方便討論扣汪,本人新建了一個微信群(算法交流),想要加入的锨匆,請?zhí)砑游业奈⑿盘枺簔hujinhui207407 謝謝崭别。另外,本人的個人博客 http://www.kyson.cn 也在不停的更新中恐锣,歡迎一起討論
知識點
- 二分法查找(BinarySearch)
- 歐幾里得算法
題目
1.1.22 使用1.1.6.4 中的 rank()遞歸方法重新實現(xiàn) BinarySearch 并跟蹤該方法的調(diào)用茅主。每當該方法被調(diào)用時,打印出它的參數(shù) lo 和 hi 并按照遞歸的深度縮進土榴。提示 :為遞歸方法加一個參數(shù)來保存遞歸的深度诀姚。
1.1.22 Write a version of Binary Search that uses the recursive rank() given on page 25 and traces the method calls. Each time the recursive method is called, print the argument values lo and hi, indented by the depth of the recursion. Hint: Add an argument to the recursive method that keeps track of the depth.
分析
書中的1.1.6.4介紹的二分法的遞歸實現(xiàn)如下:
public static int rank(int key, int[] a) {
return rank(key, a, 0, a.length - 1);
}
public static int rank(int key, int[] a, int lo, int hi) {
//如果key存在于a[]中,它的索引不會小于lo且不會大于hi
if (lo > hi)
return -1;
int mid = lo + (hi - lo) / 2;
if(key < a[mid])
return rank(key, a, lo, mid - 1);
else if (key > a[mid])
return rank(key, a, mid + 1, hi);
else
return mid;
}
答案
public static int rank (int key,int[] a) {
return rank(key,a,0,16,1);
}
public static int rank (int key,int[] a,int lo,int hi,int deep) {
if (hi < lo) return - 1;
int mid = lo + (hi - lo) / 2;
for(int i = 0 ; i < deep ; i++)
System.out.print(" ");
System.out.println("lo: "+lo+" hi: "+hi);
if (key < a[mid])
return rank (key,a,lo,mid - 1,deep + 1);
else if (key > a[mid])
return rank (key,a,mid + 1,hi,deep + 1);
else
return mid;
}
測試用例
public static void main(String[] args) {
int[] array = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
rank(10,array);
}
/**打印出的結(jié)果
lo: 0 hi: 16
lo: 9 hi: 16
lo: 9 hi: 11
**/
代碼索引
題目
1.1.23 為 BinarySearch 的測試用例添加一個參數(shù):+ 打印出標準輸入中不在白名單上的值; -鞭衩,則打印出標準輸入中在名單上的值学搜。
1.1.23 Add to the BinarySearch test client the ability to respond to a second argument: + to print numbers from standard input that are not in the whitelist, - to print numbers that are in the whitelist.
分析
解答這道題需要我們對IDE環(huán)境(這里使用eclipse)做一些設置,我也寫了一篇教程:算法練習(5):Eclipse簡易教程
感謝@xiehou31415926提出论衍。之前這題我理解錯誤瑞佩,現(xiàn)在給讀者解釋一下這道題的意思,“+”和“-”是作為參數(shù)傳進來的坯台。當傳入的參數(shù)是“+”時則打印出標準輸入中不在白名單上的值炬丸。
答案
public class BinarySearchWithParams {
public static int rank(int key, int[] a) {
int lo = 0;
int hi = a.length - 1;
while (lo <= hi) {
int mid = lo + (hi - lo) / 2;
if (key < a[mid])
hi = mid - 1;
else if (key > a[mid])
lo = mid + 1;
else
return mid;
}
return -1;
}
public static void main(String[] args) {
//這里參數(shù)symbol本來是要傳進來的,這里寫死,是為了Demo方便
char symbol = '-';
int[] whitelist = {1,2,3,4,5,6,7,11,222};
Arrays.sort(whitelist);
while (!StdIn.isEmpty()) {
int key = StdIn.readInt();
int found = rank(key, whitelist);
if ('+' == symbol && found == -1)
StdOut.println(key);
if ('-' == symbol && found != -1)
StdOut.println(key);
}
}
}
代碼索引
題目
1.1.24 給出使用歐幾里得算法計算 105 和 24 的最大公約數(shù)的過程中得到的一系列 p 和 q 的值稠炬。擴展該算法中的代碼得到一個程序Euclid焕阿,從命令行接受兩個參數(shù),計算它們的最大公約數(shù)并打印出每次調(diào)用遞歸方法時的兩個參數(shù)首启。使用你的程序計算 1 111 111 和 1 234 567 的最大公約數(shù)暮屡。
1.1.24 Give the sequence of values of p and q that are computed when Euclid’s algo- rithm is used to compute the greatest common divisor of 105 and 24. Extend the code given on page 4 to develop a program Euclid that takes two integers from the command line and computes their greatest common divisor, printing out the two arguments for each call on the recursive method. Use your program to compute the greatest common divisor or 1111111 and 1234567.
分析
最大公約數(shù)(greatest common divisor,縮寫為gcd)指兩個或多個整數(shù)共有約數(shù)中最大的一個。a毅桃,b的最大公約數(shù)記為(a褒纲,b),同樣的钥飞,a莺掠,b,c的最大公約數(shù)記為(a读宙,b彻秆,c),多整數(shù)的最大公約數(shù)也有同樣的記號结闸。
歐幾里德算法又稱輾轉(zhuǎn)相除法唇兑,是指用于計算兩個正整數(shù)a,b的最大公約數(shù)膀估。計算公式gcd(a,b) = gcd(b,a mod b)幔亥。
答案
public static int gcd(int m,int n) {
int rem = 0;
int M = m;
int N = n;
if (m < n) {
M = n ;
N = m ;
}
rem = M % N ;
if (0 == rem)
return N;
System.out.println("m:"+ N + ";n:" + rem);
return gcd(N, rem);
}
public static void main (String[] args) {
int a =gcd(1111111 , 1234567);
System.out.println(a + "");
}
/**
輸出如下:
m:1111111;n:123456
m:123456;n:7
m:7;n:4
m:4;n:3
m:3;n:1
1
**/
題目
1.1.25 使用數(shù)學歸納法證明歐幾里得算法能夠計算任意一對非整數(shù)p和q的最大公約數(shù)。
1.1.25 Use mathematical induction to prove that Euclid’s algorithm computes the greatest common divisor of any pair of nonnegative integers p and q.
廣告
我的首款個人開發(fā)的APP壁紙寶貝上線了察纯,歡迎大家下載。