《算法(第4版)第1章:基础》学习笔记

来源:互联网 发布:dd for windows 编辑:程序博客网 时间:2024/05/17 04:22

第一章     基础

1.1 基础编程模型

P15:递归的算法特别适合于重复操作且操作内容相同的算法(eg:深度搜索)

 

关于Java函数传递的4点黄金口诀

1)   = 是赋值操作(任何包含=的如+=、-=、 /=等等,都内含了赋值操作)。不再是你以前理解的数学含义了,而+ - * /和 = 在java中更不是一个级别,换句话说, = 是一个动作,一个可以改变内存状态的操作,一个可以改变变量的符号,而+ - * /却不会。这里的赋值操作其实是包含了两个意思:1、放弃了原有的值或引用;2、得到了 = 右侧变量的值或引用。Java中对 = 的理解很重要啊!!可惜好多人忽略了,或者理解了却没深思过。

2)   对于基本数据类型变量,= 操作是完整地复制了变量的值。换句话说,“=之后,你我已无关联”;至于基本数据类型,就不在这科普了。

3)   对于非基本数据类型变量,= 操作是复制了变量的引用。换句话说,“嘿,= 左侧的变量,你丫别给我瞎动!咱俩现在是一根绳上的蚂蚱,除非你再被 = 一次放弃现有的引用!!上面说了 = 是一个动作,所以我把 = 当作动词用啦!!”。而非基本数据类型变量你基本上可以

4)   参数本身是变量,参数传递本质就是一种 = 操作参数是变量,所有我们对变量的操作、变量能有的行为,参数都有。所以把C语言里参数是传值啊、传指针啊的那套理论全忘掉,参数传递就是 = 操作[W用1] 

 

1.2 数据抽象

P42:赋值语句不会创建新的对象,而是形成一个引用(有点类似于c语言中指针的概念)

P43:将对象作为参数传递给方法时,例如add(class a , class b),当使用add(c , d)的时候,隐含了一个a=c,d=b的赋值引用,调用过程中,没办法操作c、d;但是改变a、b中的数值时,c所指向(引用)的那个class对象的值发生改变。

P66:对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。

P69:创建一个含有N个对象的数组,需要使用N+1次new关键字:1(创建数组)+N(创建对象):

E.g.: Counter[] a = new Counter[2]; for(int i=0;i<2;i++)  a[i]=new Counter(“test”);

P70:Java的引用被称为安全指针:只能进行创建(new)和复制(=),保证每个指针都指向一个对象

1.3 背包、队列和栈

P84:Java不能创建泛型数组,想使用泛型数组需要经过类型转换:Item[] a =(Item[])new Object[cnt];

P84:创建包含泛型数据的类:e.g.: public classFixedCapacityStack<Item> {…}

P85:迭代器Iterator<Item>是一个实现hasNext()和next()方法的类的对象

P86:在任意可迭代的集合数据类型中都需要实现:

Ø  集合数据类型必须实现一个iterator()方法并返回一个Iterator对象;

Ø  Iterator类必须包含两个方法实现:hasNext()和next();

Ø  集合数据类型实现Iterable:public classStack1<Item> implements Iterable<Item>

Ø  iterator()方法返回一个Iterator对象:@Override

                                                                 public Iterator<Item> iterator() {

                                                                 // 调用内部类ListIterator

                                                                 return new ListIterator<Item>(first);

                                                                    }

Ø  ListIterator类实现Iterator,实现hasNext()和next();

P86:迭代器的作用:①实现迭代器后使用其中的3个函数;②for_each结构只能对数组或着实现了迭代器的序列;

参考:http://blog.csdn.net/zxq1138634642/article/details/8092327

P100:创建一个字符串栈数组:Stack<String>[] a = (Stack<String>[])[W用2] new stack[N];

 

1.4 算法分析

P118:希望为各种基础问题找到对数级别、线性级别或是线性对数级别的算法。

P123:成本模型并不成熟,还需要改进:

Ø  2+cN~2N² 中,前提是假设很小,但事实并不一定如此,要对大常数保持敏感;

Ø  内循环是决定性因素的假设并不总是正确的;

Ø  每条指令所执行的时间总是相同的假设并不总是正确的。这里考虑的是计算机系统会用缓存技术组织内存,访问数据的时间不一定相同;

Ø  计算器总是用时运行着很多程序,Java只是争夺资源的众多程序之一,Java本身也有很多影响程序性能的选项和设置;

Ø  输入内容并不一定满足满足运行时间应该与输入无关的假设,例如:对数组的内容可能会有return/break等提前结束的情况;

 

1.5 案例研究:union-find算法

171101:

P141:quick-union算法中由于find()方法的改变,连通分量/域的意义也发生改变,在图1.5.3中,连通分量/域的定义是id[]中的值相同;而在quick-union算法中,j=id[i]代表的是i触点的父节点的位置j,而一棵树代表一个连通分量/域。

Program PS:

一个项目中有多个类,每个类都有自己的main是可以,但是在启动程序时要选择用哪一个类。在eclipse里一般默认当前界面的mian函数。

读入数据的3种方式:http://blog.csdn.net/u010109335/article/details/54862071

随机数的产生:http://www.cnblogs.com/elleniou/p/3334886.html

 


 [W用1]https://www.zhihu.com/question/31203609/answer/51473602

 [W用2]需要进行转换

阅读全文
0 0
原创粉丝点击