数据结构与算法分析(读书笔记):1.引论

写出一个可以工作的程序并不够。

对于大量输入我们要:
1. 估计运行时间
2. 改进程序速度与确定瓶颈的方法。

如果N整除A-B,那么我们说A与B模N同余。记为A B(mod N),如81 61 1(mod 10).(看不见的符号为恒等号)

数据结构分析中,两个经常证明结论的常用方法:1.归纳法2. 反证法

当一个函数用它自己来定义时就称为是递归的。
注意:对于数值计算使用递归不是好主意。

递归:跟踪挂起的函数调用(这些调用已经开始但是正等待着递归调用来完成)及其变量的记录工作都是由计算机自动完成的。

递归的基本原则:
1. 基准情形。要有基准情形,不用递归就能求解知道答案。
2. 不断推进。对于需要递归求解的情形,递归调用必须朝着基准情形的方向推进。
3. 设计法则。假设所有的递归调用都能运行。
4. 合成效益法则。在求解问题的同一个实例中,切勿在不同的递归调用中做重复性工作。(原始的Fib求解过程中就有很多重复工作)

关于try,catch语句,当try中有异常时,直接跳到catch中,即try中异常后的语句不执行。执行完try,catch语句后,继续往下执行,即向下执行catch外的语句。

Java异常:
1. 标准异常。标准run-time异常包含诸如整数除以0和无效的数组访问这样的事件。由于这些事件在任何地方都可能发生,要求对他们每个都进行异常处理,负担就太重了。所以也就不在代码中强制要求你catch。但是,如果提供了catch,那么就捕获。如果没有提供的话,则按照常规 被传递,很可能传过main方法。这种情况下,就会产生一个非正常程度终止,并显示错误信息。
2. 检验的异常。必须提供一个catch语句块,或者明确指出这个异常要使用方法声明中的throws子句向上传递。

考虑这样一个设计问题:

有我们称之为盒子(box)的抽象的集合。盒子允许访问或删除集合中的任意项,他们是getAny和removeAny操作。设该集合是空集,那么如何处理删除呢?
几种可能处理方法:
1. 什么都不做,在一个空的容器中进行删除就是不操作。
2. 让removeAny返回一个boolean量指出删除是否成功
3. 抛出一个异常。
补充使用异常知识:
优点:可以简化实现数据结构的代码
缺点:它潜在地使得使用数据结构的代码复杂化,因为程序必须准备处理异常。
当异常发生时,其代价是非常昂贵的。只要异常用于个别的和很少发生的情况,那么这个代价就是合理的。不过,当异常代替返回语句时,则可能出现严重的性能上的问题。
因此,尽量避免在各种容器类中乱用异常。
一般地,访问数据结构的操作都返回项。removeAny,不仅删除一个任意项,而且还返回这个被删除的项。如果盒子是空的,那么就返回null。
这个方法缺点:错误现在是可选的。运行时,引用null,程序将生成异常,优点是程序运行可能更快,它避免引入不必要的try,catch语句块。

从终端读取输入的代码:

//从终端读取
public static void readFromConsole(){
            BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
            String oneLine;
            StringTokenizer str;
            int x,y;
            System.out.println("enter 2 ints on one line:\n");
            try{
                oneLine = in.readLine();
                str = new StringTokenizer(oneLine);
                if(str.countTokens()!=2){
                    throw new NumberFormatException();
                }
                x = Integer.parseInt(str.nextToken());
                y = Integer.parseInt(str.nextToken());
                System.out.println("max: "+Math.max(x, y));
            }catch(Exception e){
                System.out.println("error: need two ints");
            }
        }

java基本法则之一是对终端I/O有效的操作对文件也有效。为了处理文件,不是从InputStreamReader对象构造BufferedReader对象,而是从FileReader对象构造它,FileReader对象本身可以通过提供文件名来构造。

从文件读取

//改动
BufferedReader in = new BufferedReader(new FileReader(stringName));
//最后必要忘了关闭流
in.close();

关于为什么要记得关闭流的解答:
http://www.javapractices.com/topic/TopicAction.do?Id=8

你可能感兴趣的:(数据结构与算法)