第一章 引论
一、概述本书讨论内容
一般情况下,写出一个可以正常工作的程序远远不够;在大量数据输入的情况下,程序能否在合理的时间内运行停止并输出正确的答案是一个重要的问题;所以本书首先会讲述对于大量的输入如何估计程序的运行时间和确定程序瓶颈的方法,并讲述如何彻底改进程序运行速度。
二、数学知识复习
1.指数
2.对数
3级数
4.模运算
5.证明方法:
A)归纳法证明
B)反证法证明
例:证明存在无穷多个素数。
三、递归简论
1.递归:当一个函数用它自己来定义时就称为是递归(rescusive)的。
注:java提供的只是遵循递归思想的一种尝试;不是所有的数学递归函数都能被有效地(或正确地)由java的递归模拟来实现。
例:打印输出整数
package com.caitang.algorithm.recursivepartition;
/**
* 递归打印字符
* @author Administrator
*
*/
public class PrintString
{
public static void main(String [] args)
{
printStrs(123456789);
}
/**
* 逐个字符打印所给整数
* @param n 这里系统标准输出流每次都只打印一个字符
*/
private static void printStrs(int n)
{
if(n>=10)
printStrs(n/10);
System.out.println(n%10);
}
}
运行结果:
2.递归法则:
A)基准情形。递归实现中必须含有不用递归就能求解的基准情形。
B)不断推进。对于基准情形之外的情况——必须要使用递归的情况,递归调用总能朝着一个基准情形推进。
C)设计法则。假设所有的递归调用都能运行,无需跟踪其他调用细节。
D)合成效益法则。在求解一个问题的同意实例时,切勿在不同的递归调用中做重复性的工作。
3.递归的数学根据是归纳
四、java泛型
1.Java实现泛型的方式:
A)使用Object表示泛型(使用8种基本数据类型时需要使用基本类型的包装类,已经支持自动拆装箱)
B)使用接口类型表示泛型
2数组类型和集合类型的兼容性(协变性)与泛型和泛型集合类型的非协变性
3.java新特性对泛型的支持
A)菱形运算符
B)带有限制的通配符
java5使用通配符来弥补泛型集合不具有协变性的不足。
C)类型界限
D)类型擦除
泛型在很大程度上是Java语言中的成分而不是虚拟机中的结构;泛型类可以由编译器通过所谓的类型擦除过程转变为非泛型类,这样,编译器就生成一种与泛型类同名的原始类。
E)对泛型的限制
i)基本类型不能用作泛型的类型参数。
ii)instanceof 检测和类型转换工作只对原始类进行。
iii)在一个泛型类中,static方法和static域均不可引用类的类型变量。
iiii)不能创建一个泛型类型的实例,也不能创建一个泛型数组。
iiiii)参数化类型的数组的实例化是非法的。
五、函数对象
一个函数通过将其放在一个对象内部而被传递,这样的对象通常叫做函数对象。