算法-第四版

算法第四版前期买过纸质书,但是一直束之高阁,刚在书架上找了一,已经不知所踪。看来电子版还是有好处的,在京东读书上买了电子版,准备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"
        }

这样就可以加参数了,运行截图:

环境就绪,可以开始奇妙的算法之旅了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值