写在前面:配套网站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位机器中)。

《算法4》读书笔记(一)相关推荐

  1. mysql数据库权威指南_MySQL_MySQL权威指南读书笔记(三),第二章:MYSQL数据库里面的数 - phpStudy...

    MySQL权威指南读书笔记(三) 第二章:MYSQL数据库里面的数据 用想用好MYSQL,就必须透彻理解MYSQL是如何看待和处理数据的.本章主要讨论了两个问题:一是SQL所能处理的数据值的类型:二是 ...

  2. MongoDB权威指南读书笔记——CRUD

    插入并保存文档 插入是向MongoDB中添加数据的基本方法.可以使用Insert方法向目标集合插入一个文档:db.foo.insert({"bar" : "baz&quo ...

  3. HTTP权威指南读书笔记

    <<HTTP权威指南>>读书笔记 第一部分:Web的基础 第1章:HTTP概述 主要内容 1.什么是HTTP 2.HTTP的基本组件 HTTP HTTP:HTTP(Hypert ...

  4. HTML5权威指南----读书笔记

    <!DOCTYPE html> <html> <head><meta name = 'keywords' content="HTML5权威指南--- ...

  5. 计算机网络和http权威指南 读书笔记

    计算机网络笔记 网络层 网络层向上提供无连接的,尽最大努力交付的数据报服务 网络层不提供数据质量承诺 物理层使用的中间设备叫转发器repeater 数据链路层叫网桥bridge 网络层叫路由器rout ...

  6. MapReduce总结 + 相关Hadoop权威指南读书笔记(未完......欢迎补充,互相学习)

    文章目录 MapReduce概述 MapReduce优缺点 MapReduce核心思想 MapReduce进程 MapReduce编程规范 WordCount 案例实操 本地测试 集群测试 Hadoo ...

  7. android开发读书笔记,android开发权威指南读书笔记

    第17章 Fragment 1.在res目录下增加 layout-sw600dp 目录,用于存放7英寸及以上尺寸屏幕的布局文件.10英寸以上平板用 sw720dp.如果是更小的屏幕,如 480*800 ...

  8. java性能权威指南中文_Java性能权威指南读书笔记--之一

    JIT(即时编译) 解释型代码:程序可移植,相同的代码在任何有适当解释器的机器上,都能运行,但是速度慢. 编译型代码:速度快,电视不同CPU平台的代码无法兼容. java则是使用java的编译器先将其 ...

  9. javascript权威指南读书笔记之二——词法结构

    本章讲述的内容,用通俗的语言来说,就是应该注意的地方,这些也许和我们所学的其他语言类似,也许完全不同,比如一开始就介绍说javascript程序中的每个字符都是用两个字节表示的,但有些程序设计者习惯于 ...

  10. HTTP权威指南读书笔记(一)HTTP概述、URL和资源及报文详解

    一.HTTP概述 1.WEB客户端和服务器. 2.资源:资源可以是各种格式的静态文件,也可以是应用程序. 3.媒体类型 4.URI:统一资源标识符 URL:统一资源定位符. URL的第一部分称为方案: ...

最新文章

  1. malloc和free函数详解
  2. 网络推广——网络推广专员面对网站收录异常要学会多角度分析
  3. torchvision 笔记:transforms.Normalize()
  4. tp5.1的安装与运行流程
  5. Pytorch-张量相加的四种方法 / .item()用法
  6. EduCoder Linux文件/目录高级管理三
  7. hibernate底层dao
  8. linux文件编程(3)—— main函数传参、myCp(配置成环境变量)、修改配置文件、整数和结构体数组写到文件
  9. 解决方案大全ImportError: libta_lib.so.0: cannot open shared object file: No such file or directory
  10. python画带状图_13个使用Matplotlib实现数据可视化的Python代码
  11. Visual Studio2012版安装教程--C++新手初学者
  12. 订单参数异常,请重新下单后再发起付款。(ALIN42682)
  13. 单片机系统的电磁干扰要如何消除?
  14. 第二届春回燕归 浙籍精英峰会见闻
  15. 再见,安卓开发权威指南
  16. 做笔记就用印象笔记,支持录音做笔记(附插件下载,一键将网页内容保存笔记中进行编辑)...
  17. 潮起潮落,自助餐还是被“吃”垮了
  18. Python VTK计算曲面的高斯曲率和平均曲率
  19. Linux删除文件报no such file
  20. winform模拟登陆网页_用c#模拟手机app向网站登录,如何写?

热门文章

  1. windows下的OpenGL视频播放器开发环境
  2. YOLACT实时实例分割
  3. python怎么画长方形_Python如何绘制长方形?
  4. php输出二维函数,兼容php二维数组取值函数array_column使用
  5. 【51单片机】51单片机学习资料合集
  6. Spring的基础知识精讲,创客学院一招教你彻底掌握
  7. android 录像抠取人像,snapseed抠图教程
  8. [tips] 1.2 优麒麟ubuntu 20安装ROS2 Foxy版本
  9. SpringBoot整合Mybatis未打成jar正常运行,打成jar包,TypeAliases配置失败致使mybatis无法找到实体类的问题
  10. 莫道君行早更有早来人(一)黄页