《算法4》读书笔记(一)

article/2025/8/6 10:54:30

写在前面:配套网站algs4.cs.princeton.edu,可以把这个网站作为编程的时候的参考资料。这本书比较实用(某瓣评分9.3),但没有动态规划部分,作为两三年没怎么碰过算法和数据结构的菜狗,看了《图解算法》后(这本书提供了对算法大概的引导,动态规划、分治策略等都有提及,图比较多,比较有趣味性,代码是用python写的),意识到还是得系统学习学习,当然复习了一下java(ps:卑微地拜读了java核心技术一的前九章,虽然翻译有的地方有些离谱,但因为本菜狗本科学过java开发,做过几个java web小项目、学了安卓开发,所以还是有点基础的,刚入门的朋友建议先看一看学校发的(或者其他学校会配置的)java基础知识书,动手敲敲代码做几个小项目,再啃这本(工具)书>.<)。

现在来啃算法书啦,重新打好基本功,拓展一下编程时的思路,计划啃的同时刷一刷leetcode(好歹得复习复习,直接上手代码惨不忍睹QAQ)。章节就是:基础、排序、查找、图、字符串。注意事项:看书上的代码的时候记得和配套网站上对应的代码对照着来,有的代码可能和书上的代码不太一样。配套视频网站

第一章——基础

1.不熟悉欧几里得算法的可以在学习1.1节后完成练习1.1.24和练习1.1.25。

2.其中的代码只用到了很少的java特性,优先使用了大多数编程语言所共有的语法,实现了分离算法的思想和实现细节。

3.字面量是值在源码中的表示。

4.将浮点型转换成整型时会截断小数而不是四舍五入,比如(int)3.7的结果是3,而不是4。

5.声明初始化数组举例:int[] a = {1, 2, 3, 4};

6.方法的签名是方法名、参数个数、类型及顺序,书上有的图画的不太清楚,把权限修饰符和返回值类型也包含进去了,也或许是我记错了???(转21)

7.再次强调java中方法传递参数是值传递,方法处理的是参数的值,而不是参数本身。

8.可能需要使用书配套的一些代码、数据和标准库,所以去书配套的网站algs4.cs.princeton.edu看了一下,把包含书上代码、练习题答案代码和标准库的algs4.jar、包含书上对应所有数据的algs4-data.zip、标准库对应的stdlib.jar都下载到了/home/erin/Algo4Code文件夹中,因为暂时用eclipse开发,需要标准库的时候就在类路径中包含stdlib.jar:在项目上右键New——Folder——新建文件夹lib专门放jar包——复制stdlib.jar到lib文件夹中——对该jar文件右键选择Build Path——选择Add to Build Path,需要用algs4.jar也是一样的操作(参考链接)(或者按照网站上的步骤进行),删除jar时应该去Project——Properties——Java Build Path——Libraries——remove对应的jar。javac-introcs和java-introcs命令是什么(待学习)。

注意事项:只能在default package中导入stdlib.jar,不能从自己命名的包中访问stdlib.jar中的类,如果需要将书配套的库在自己命名的包或默认包中一起使用,要导入algs4.jar。

9.以下终端命令用于打印文件内容:

more 任意文本文件名

10.原书23页表1.1.15中String行,格式化字符串是"%14.5s"时,输出结果应该是“ Hello”。

Scanner read = new Scanner(System.in);

从终端读入数据,判断是否还有数据、处理数据时应该配套,如read.hasNext()和read.next();或者read.hasNextInt()和read.nextInt();eclipse控制台不再输入字符用ctrl+d。

12.终端重定向输出(例):java RandomSeq 1000 100.0 200.0 > data.txt,将输出结果存储在data.txt中。

重定向输入(例):java Average < data.txt,从data.txt中读取数据。

将一个程序的输出重定向为另一个程序的输入为管道,例:java RandomSeq 1000 100.0 200.0 | java Average,将RandomSeq的标准输出和Average的标准输入指定为一个流。

13.没按照网站上的方法给jar包添加路径啥的,瞎折腾两种方法运行书上代码BinarySearch.java(ps:erin是我的用户名):

(1)在终端运行代码:

a.已将algs4.jar和algs4-data.jar下载到/home/erin/Algo4Code文件夹,解压缩这两个文件成文件夹algs4和algs4-data;

b.打开终端,cd到/home/erin/Algo4Code/algs4目录下,执行命令:

javac edu/princeton/cs/algs4/BinarySearch.java

因为该代码在包edu.princeton.cs.algs4中,执行器(java命令)会找该包下的代码BinarySearch.java,所以这样才能避免在执行(java命令)时出现错误:找不到或无法加载主类。

c.执行命令:

java edu/princeton/cs/algs4/BinarySearch ../algs4-data/tinyW.txt < ../algs4-data/tinyT.txt

…/表示当前目录的上一级目录,回到Algo4Code文件夹,结合代码理解,将algs4-data文件夹下的tinyW.txt作为命令行参数,并且代码重定向输入为algs4-data文件夹下的tinyT.txt。

d.运行成功:
在这里插入图片描述

(2)在Eclipse运行代码:

a.将下载到/home/erin/Algo4Code文件夹下的algs4.jar添加到项目中,我新建了项目AlgoFourStudy,在项目上右键New——Folder——新建文件夹lib(专门放jar包)——复制algs4.jar到lib文件夹中——对该jar文件右键选择Build Path——选择Add to Build Path,然后Referenced Libraries中就有了algs4.jar。

b.同样在项目上右键新建文件夹data(专门放数据)——复制/home/erin/Algo4Code/algs4-data文件夹下的所有文件到data文件夹。

c.注意tinyW.txt是作为命令行参数的,右键algs4.jar下的BinarySearch.class——Run As——Run Configurations——选择Arguments,在Program Arguments栏输入作为命令行参数的文件路径,因为已经在项目下新建data文件夹并且导入了所有书上代码所需数据文件,所以路径是data/tinyW.txt,或者选择~/Algo4Code/algs4-data文件夹下的tinyW.txt文件,路径就是/home/erin/Algo4Code/algs4-data/tinyW.txt。
在这里插入图片描述

d.tinyT.txt是被代码重定向为输入的,所以右键algs4.jar下的BinarySearch.class——Run As——Run Configurations——选择Common——选择Input File——选择Workspace,选择data目录下的tiny.txt,或者选择File System,选择文件为之前解压缩了的/home/erin/Algo4Code/algs4-data/tinyT.txt。ps:运行代码后没有自动终止运行,需要ctrl+d终止或者手动选择终止。

在这里插入图片描述

参考链接:

(1)配置《算法 第四版》的Eclipse开发环境

(2)Eclipse中怎样运行带命令行参数的java程序

(3)Eclipse重定向输入输出到文件

没用到,但码住:如何把他人的代码项目和文件导入到Eclipse中:file-import-general-existing projects into workspace-next-browse选择已存在的项目文件夹,博客

14.答疑部分:

(1)使用int类型表示较小的数(小于10个十进制位,2×10^9),用long表示10亿以上的数(和C/C++一样)。

(2)不能用符号<或>比较String变量。

(3)注意负数的除法和余数结果。

(4)注意一个for循环和它的while循环的主要区别是,前者的递增变量在循环结束后是不可用的,后者的是可用的。

(5)声明数组时,int a[];是C语言做法,int[] a;是java提倡的,二者等价且合法。

(6)如果a[]是一个数组,用System.out.println(a);或者StdOut.println(a);输出的不是数组中的元素,而是这个数组的地址。

(7)java中不能把一个静态方法作为另一个静态方法的参数。

15.练习题暂时没做。

16.数据类型是一组值和一组对值的操作的集合,对象是能承载数据类型的值的实体,对象有三大重要特性:状态(数据类型中的值)、标识(可以理解为对象在内存中的位置)、行为(数据类型的操作)。

17.静态方法调用的开头是类名(按照习惯开头字母为大写的),非静态方法调用的开头是对象名(按照习惯开头字母是小写的)。

18.注意别名的情况:两个变量同时指向同一个对象。ps:容易出现bug。

19.将对象作为参数传递时,传递的是对象的引用,方法虽然不能改变原始的引用(如将该引用指向另一个对象),但该引用可以改变对应对象的值。

20.在java中,对象数组是一个由对象的引用组成的数组,而不是对象本身组成的数组。如果对象很大,移动的时候效率比较高,但如果对象很小,每次获取信息时需要通过引用反而会降低效率。

21.(接6)图1.2.6和图1.2.7圈的签名的方框把权限修饰符和返回值类型包含在内了,迷惑行为,仔细看了书上1.2.3.3节写的签名是:“指定了方法名、返回值类型和所有参数变量的名称”,我:???翻译出问题了???回头翻了翻《Java核心技术卷一》,签名就包含方法名、参数数量、类型和顺序啊? 翻了下维基百科的定义,核心技术卷一也没错啊,算法4可能描述有误,咱还是按照官方工具书上的来。

22.通过将API作为用例和实现之间唯一的依赖点来保持模块之间的独立性。

23.书中提到“子类继承会破坏封装,其使用在系统程序员和应用程序员之间存在争议”,听大佬的。

24.每种原始数据类型都有对应的封装类型,如int对应Integer等,在需要的时候java会自动将原始数据类型转换为封装类型。

25.书65页最下面“不存在能够引用初始化变量b的那个Date对象的引用”,结合上下文,应该是“不存在能够引用初始化变量a的那个Date对象的引用”。

26.“试图改变final变量的值的代码会产生编译时错误”,final只能修饰原始数据类型的变量,不能用于修饰引用类型变量。

27.自动将一个原始数据类型转换为一个封装类型被称为自动装箱反之则是自动拆箱。

28.在1.3节中的类Bag、Stack、Queue都是本书开发的algs4.jar中的。

29.因为书上有些示例代码不在algs4.jar中,所以找了一下,从配套网站下载了introcs.jar和introcs-data.jar到Algo4Code文件夹,解压缩后发现其中有Dijkstra的双栈算术表达式求值算法对应的代码Evaluate.java,老规矩将jar包导入eclipse中使用,运行Evaluate.class但报错:

Exception in thread "main" java.lang.NoClassDefFoundError: StdInat Evaluate.main(Evaluate.java:39)

因为introcs.jar解压缩后可以看到其中的java文件都没有包名,都处于默认包下,而之前用的algs4.jar中已经包含了stdlib.jar,所以没有单独添加stdlib.jar到build path,想要在默认包中使用stdlib.jar就也将其加入了build path,步骤:将stdlib.jar添加到项目下的lib文件夹——>右键Build Path——>选择Add to Build Path。之后按照Evaluate.class开头的注释输入算术表达式( 1 + ( ( 2 + 3 ) * ( 4 * 5 ) ) ),运行成功:
在这里插入图片描述

30.FixedCapacityStackOfStrings类、FixedCapacityStack类不存在algs4.jar或者introcs.jar中,注意java不能创建泛型数组,如:

a = new Item[2];

而要用到类型转换:

a = (Item[]) new Object[2];

这样操作之后,书中提到“java编译器会给出一条警告,但可以忽略”。

31.algs4.jar中的ResizingArrayStack类相较于书上所示的代码稍有改进,设置了数组的初始容量。对于断言assert,如果对应表达式成立,则程序正常运行;如果表达式不成立,则报错并终止程序。

32.采用双向链表可以实现任意插入和删除操作(每个结点都有两个链接)。

33.“将栈保存为一条链表,栈的顶部就是表头,在表头添加元素(原表头节点后移)或删除元素(删除原表头节点)相当于栈的下压和弹出元素。”这样增加或删除元素都与栈的元素个数无关,终端运行算法1.2下压堆栈(链表实现)如图:

在这里插入图片描述

34.基于链表实现的Queue,其表头就是队列的头部,因此是在表尾添加元素(队尾添加),在表头删除元素(队列弹出)。

35.注意:“使用某种数据结构不仅仅是为了获得我们能想象的各种操作,也是为了准确指定我们所需要的操作”,比如java内置的遗留类java.util.Stack,如果需要栈的时候不要用到这个类,因为添加了一些多余的方法,《java核心技术卷一》中也提到了这一点。

36.对于多数程序,经过以下几个步骤得到其运行时间的数学模型:

1)确定输入模型,定义问题的规模;

2)识别内循环;

3)根据内循环中的操作确定成本模型;

4)对于给定的输入,判断这些操作的执行频率。

37.常见的增长数量级由慢到快分别是:常数级别(1)、对数级别(logN)、线性级别(N)、线性对数级别(NlogN)、平方级别(N2)、立方级别(N3)、指数级别(2^N)。

38.二分查找的运行时间和问题规模成对数关系,对数的底数和增长的数量级无关,所以描述对数级别时一般使用logN;运行时间的增长数量级是NlogN的算法有合并排序、快速排序等;增长数量级是N^2的算法有选择排序、插入排序等。

39.等差数列求和:S=n(a1+an)/2,n是数列中数的个数,a1是第一项,an是最后一项。等比数列求和,举例:1+2+4+8+…+N=2*N-1,N=2^n。
在这里插入图片描述

40.倍率定理:如果T(N)`a*N^b*lgN`那么T(2N)/T(N)2^b。

41.计算机访问内存的方式都是一次一字节(8位,8bit=1Byte),java中boolean类型和Byte对应一个字节,char类型对应两个字节,int和float类型对应4个字节,long和double类型对应8个字节。64位构架的计算机中需要8字节来表示机器地址,而32位的需要4字节。

42.对象的引用一般都是一个内存地址,占8个字节(64位机器中)。一个对象所使用的内存量包括其所有示例变量使用的内存和对象本身的开销(一般是16个字节),而且一般内存的使用都会被填充为8字节的倍数(64位机器中)。


http://chatgpt.dhexx.cn/article/fXh3uZDX.shtml

相关文章

《算法4》深入理解红黑树

红黑树是一种性能非常优秀的数据结构&#xff0c;关键在于它能保证最坏的性能也是对数的&#xff0c;主要是因为它是一种平衡的树&#xff0c;所以也叫平衡查找树。要理解红黑树&#xff0c;最好先看看我的上一篇博客《算法4》符号表以及二叉查找树&#xff0c;了解二叉查找树以…

【算法4总结】第四章:图

目录备份 第四章&#xff1a;图 概述 图可以根据是否有向和带权分成以下四种&#xff1a; 无向图 &#xff08;无向不带权&#xff09;有向图 &#xff08;有向不带权&#xff09;加权无向图&#xff08;无向带权&#xff09;加权有向图&#xff08;有向带权&#xff09; …

算法4(一、递归学习)

每次用递归都感觉有点难&#xff0c;这个趁着恶补基础知识的时候&#xff0c;专门看了一遍递归&#xff0c;算法4的。 1.1 递归介绍 方法可以调用自己&#xff0c;例如&#xff1a;下面给出了bin_search的二分查找的一种实现。&#xff08;算法4中使用的是Java&#xff0c;但…

【算法4总结】第一章:基础

目录备份 第一章&#xff1a;基础 我认为这一章主要介绍的是如何使用工具。 一共五节&#xff0c;前两节主要是对 Java 语法的回顾&#xff0c;第三节则是三个数据结构&#xff0c;背包&#xff0c;队列和栈的API讲解。 而第四节是讲解的是如何分析算法。第五节则是针对具体…

SQL修改语句

如果我们要修改数据库中表的数据&#xff0c;这个时候我们就要使用到UPDATE语句。 UPDATE语句的基本语法是&#xff1a; UPDATE <表名> SET 字段1值1, 字段2值2, ... WHERE ...; 例如&#xff0c;我们想更新employees表id100的记录的last_name和salary这两个字段&…

【数据库】SQL语句之修改语句(INSERT,UPDATE,DELETE)

1.INSERT INSERT INTO <表名> (字段1, 字段2, ...) VALUES (值1, 值2, ...); 例如&#xff1a; 一次插入一个 INSERT INTO students (class_id, name, gender, score) VALUES (2, 小明, M, 80);一次插入多条 INSERT INTO students (class_id, name, gender, score) VA…

SQL Server修改数据

本篇主要讲解的是SQL Server 中修改数据的几种语句&#xff1a; INSERT语句INSERT INTO SELECT语句UPDATE语句DELETE语句 一&#xff1a;INSERT语句 INSERT语句向表中添加新行&#xff0c;以下是INSERT语句的最基本形式&#xff1a; 首先&#xff1a;table_name指定要插入的…

使用SQL语句修改表数据

使用SQL语句修改表数据 文章目录 使用SQL语句修改表数据利用INSERT语句输入数据利用UPDATE语句更新表数据利用DELETE语句删除表中数据利用Truncate Table语句删除表中数据 利用INSERT语句输入数据 INSERT语句的基本语法格式如下&#xff1a; 上述格式主要参数说明如下&#xf…

初探POC编写

文章目录 前言什么是POC什么是 ExpPOC注意事项尝试编写第一个POCpikachu sql盲注poc参考 前言 想锻炼一下编程能力&#xff0c;师兄说以后很重要的&#xff0c;最好学好一点 但是我又想学习安全相关的&#xff0c;那就来练练poc吧 什么是POC PoC(全称: Proof of Concept), …

POC_MeterSphere-RCE

MeterSphere-RCE 漏洞详情影响范围指纹- fingerPOC-YAML《飞致云MeterSphere开源测试平台远程代码执行漏洞》 漏洞详情 MeterSphere一站式开源持续测试平台存在的远程代码执行漏洞。由于自定义插件功能处存在缺陷,未经身份验证的攻击者可利用该漏洞在目标系统上远程执行任意…

【POC---概念验证】

文章目录 前言一、Proof of Concept是什么&#xff1f;验证内容 PoC测试工作准备前提PoC测试工作参与者PoC测试工作准备文档PoC测试工作第一阶段 工作启动第二阶段 产品宣讲及现场集中测试第三阶段 技术测评第四阶段 间歇性测试工作 第五阶段 商务验证第六阶段 背书归档、分析总…

POC_Jenkins

简介 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成,Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行。通常与版本管理工具(SCM)、构建工…

网络安全中的POC、EXP、Payload、ShellCode_网络安全payload是什么意思

什么是 POC、EXP、Payload&#xff1f; POC&#xff1a;概念证明&#xff0c;即概念验证&#xff08;英语&#xff1a;Proof of concept&#xff0c;简称POC&#xff09;是对某些想法的一个较短而不完整的实现&#xff0c;以证明其可行性&#xff0c;示范其原理&#xff0c;其…

Zendstudio 9.0.2 安装Aptana3 并且配置 jQuery

原文地址:http://my.oschina.net/feek/blog/64517 aptana-javascript-jquery.ruble文件夹下载地址: http://dl.dbank.com/c04bfgbchz 一直在用zenstudio9&#xff0c;有时候又需要用到jquery等插件辅助制作前台效果&#xff0c;想安装个Aptana3插件&#xff0c;但是查了好多网…

elfk

1. 2. ​​​​​​​ 3. 4. 5.

c/c++读写文件(c方法篇)

读写文件操作 C语言方法 参考博客&#xff1a;函数基本介绍&#xff1a; https://www.cnblogs.com/lidabo/p/6813354.html 自己写了个demo测试一下fopen、feek、fwrite、fread函数的使用&#xff0c;代码如下&#xff1a; void OperationFile_C() {FILE* fp NULL;fp fopen(…

EFLFK

目录 zookeeper概述 zookeeper 定义 Zookeeper工作机制 Zookeeper特点 Zookeeper数据结构 Zookeeper 应用场景 Zookeeper选举机制 第一次启动选举机制 非第一次启动选举机制 部署 Zookeeper 集群 准备 3 台服务器做 Zookeeper 集群 安装前准备 关闭防火墙 安装 J…

fseek函数c语言_使用示例的C语言中的fseek()函数

fseek函数c语言 C中的fseek()函数 (fseek() function in C) Prototype: 原型&#xff1a; int feek(FILE *stream, long int offset, int origin);Parameters: 参数&#xff1a; FILE *stream, long int offset, int originReturn type: int 返回类型&#xff1a; int Use o…

c语言feek函数读取中文出现乱码

c语言feek函数读取中文出现乱码 在文件操作的学习中,发现读取文件的中文时会出现乱码 当输入的文字改成英文时则不会出现乱码,于是猜想是否和中文与英文占用的字节有关系,实践得出结论,的确是字节搞的鬼,那么有趣了,如果恰好文件指针指向中文字节的一半时,这个指针指向…

vue element-ui自定义表头,动态添加表头,新增行、新增列、删除行、删除列

vue element-ui表格怎样自定义表头&#xff0c;动态添加表头&#xff0c;新增行、新增列、删除行、删除列 需求描述1.自定义表头&#xff0c;表头里插入输入框2.默认初始化几行几列占位3.新增行4.新增列5.右键点击行&#xff0c;进行删除行6.右键点击表头&#xff0c;进行删除列…