算法第四版前期买过纸质书,但是一直束之高阁,刚在书架上找了一,已经不知所踪。看来电子版还是有好处的,在京东读书上买了电子版,准备2025重新阅读一下,踏踏实实的提高算法基础,不被当今AI热潮的急功近利影响,修炼基础内功。
为啥不用微信读书?因为微信读书我有会员,可以阅读本书,我就是想从京东读书买下来,花了银子,认认真真的读一遍,微信读书主要听一些新书,有好的再买。另外,gongsi屏蔽了微信读书,但可以看京东读书,呵呵,你懂的。
就在这一篇里面写一些读书感悟吧,希望能持续写下去。
特色:JAVA语言编写,可以运行的代码,这个特点比较吸引我,可运行/可设置断点跟踪,看活代码,有利于理解算法。算法不依赖JAVA的独门特性,这样有利于移植到其他语言,比如C++/GO/JAVASCRIPT等。
本书算是个算法入门,看着比《算法导论》要容易读,也用于其他学科的学生了解算法。适合大一大二学生学习。读完这个再读 算法导论,算法导论 也出了第四版,朋友发给我一个PDF文件,躺在电脑里面几年了,没有读,准备导入微信读书,学习完算法后再学,希望到时候能新写一篇体验。
广度涵盖了60年代以来的经典算法。算法大部分20行左右的代码就足以表达,体现了大道至简的精神。
有个配套网站:Algorithms, 4th Edition by Robert Sedgewick and Kevin Wayne
代码:Java Algorithms and Clients
这本书写了40年,普林斯顿出品,很佩服老外的执着/专注精神,这样反复打磨的书才值得反复阅读。
第一章 基础
算法是解决问题的方法,一种有限/确定/有效的,适合计算机实现的解决问题的方法。
本书的算法使用JAVA实现,作者还编写了一个小库,必须加载这个库,否则无法编译通过。库的作用是输入/输出/统计。
算法需要适当组织数据,为了组织数据产生了数据结构,数据结构是算法的副产品或者结果。
1.1 基础编程模型
先上程序,一个经典的二分查找算法。就用vscode吧,首先安装的microsoft的JAVA扩展,没有选oracle的,原因是oracle不太可信,另外vscode工具就是微软做的,官方扩展感觉更靠谱,提示我们下载JDK,最新稳定版本是JDK21, 从给的eclipse的一个链接顺利下载。为啥是eclipse里面发布,不得而知。
二分查找的关键是在一个有序队列中查找给定的一个key是否存在。书上的代码:BinarySearch.java
关键代码:
/**
* Returns the index of the specified key in the specified array.
*
* @param a the array of integers, must be sorted in ascending order
* @param key the search key
* @return index of key in array {@code a} if present; {@code -1} otherwise
*/
public static int indexOf(int[] a, int key) {
int lo = 0;
int hi = a.length - 1;
while (lo <= hi) {
// Key is in a[lo..hi] or not present.
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;
}
在vscode中是编译不过的,检查发现是main函数中有In,StdIn标识为红色,不认识。才想起前言中作者说的他们编写的库。就在Java Algorithms and Clients ,下面的位置,有algs4.jar,下载这个包,还是不行,如何包括到我们的运行环境,vscode的java project运行环境还是比较难设置的,需要说明一些:
1)MAVEN project
mvn install:install-file -Dfile=/path/to/your.jar -DgroupId=com.example -DartifactId=your-artifact -Dversion=1.0 -Dpackaging=jar
把JAR包放到本地仓库中,注意groupId,artifactId需要与package名称一致。不一致有没有问题?我反正没有实验成功。
2) 纯JAVA运行环境
.vscode/settings.json
{
"java.project.sourcePaths": [
"src",
"lib"
],
"java.project.outputPath": "bin",
"java.project.referencedLibraries": [
"lib/**/*.jar"
]
}
3)JAVA命令行环境
手工命令方式,需要区分操作系统,原因是Windows用分号分隔不同目录:
javac -cp .;C:\Users\username\algs4\algs4.jar HelloWorld.java java -cp .;C:\Users\username\algs4\algs4.jar HelloWorld
C:\java\alg\demo1> java -cp "./bin;./lib/algs4.jar" BinarySearch tinyText.txt
C:\java\alg\demo1> java -cp "./bin;./lib/algs4.jar" BinarySearch tinyAllowlist.txt < tinyText.txt--windows不支持重定向,linux下可用。
linux使用冒号分隔不同目录
javac -cp .:~/algs4/algs4.jar HelloWorld.java java -cp .:~/algs4/algs4.jar HelloWorld
这部分虽然比较基础,但是如果不了解,足够初学者折腾一番的,也许一折腾,大家的热情就耗尽了,不愿意继续了,希望上面的描述可以帮到初学者。
这样第一个程序能执行了吗?还不行,执行直接数组越界报错了。仔细一看,原来是运行需要参数,vscode的JAVA类如何执行时附加参数呢?问豆包/deepseek都行,或者wenxiaobai.com,不要太方便:.vscode中增加一个launch.json,里面已经有了刚才运行失败的程序,直接加上args参数就行了
{
"type": "java",
"name": "BinarySearch",
"request": "launch",
"mainClass": "BinarySearch",
"projectName": "demo1_bbde586",
"args": "tinyText.txt"
}
这样就可以加参数了,运行截图:
环境就绪,可以开始奇妙的算法之旅了。