算法--指令集合;计算时间开销的方法
第2章 算法分析
算法(algorithm)是为求解一个问题需要遵循的、被清楚指定的简单指令的集合。
PS:顺序指令集合
问题:如何估计一个程序锁需要的时间
如何将一个程序的运行时间从天或年降低到秒甚至更少
粗心使用递归的后果
将一个数自乘得到其幂,以及计算两个数的最大公因数的非常有效的算法
2.1 数学基础
一般来说,估计算法资源消耗所需的分析是一个理论问题,因此需要一套正式的系统架构。我们先从某些数学定义开始。
2.3 要分析的问题
通常,要分析的最重要的资源就是运行时间。
2.4.2 一般法则
法则1--for循环
一个for循环的运行时间至多是该for循环内部那些语句(包括测试)的运行时间乘以迭代的次数;
法则2--嵌套的for循环
从里向外分析这些循环;
在一组嵌套循环内部的一条语句的运行时间为该语句的运行时间乘以该组所有的for循环的大小的乘积;
法则3--顺序语句
将各个语句运行时间求和即可(这意味着,其中的最大值就是所得的运行时间;)
法则4--if/else语句
if(condition)
S1
else
S2
一个if/else语句的运行时间从不超过判断的运行时间再加上S1和S2中运行时间长者的总的运行时间;
其他的法则都是显然的,但是,分析的基本策略是从内部(或最深层部分)向外展开工作的;
2.4.5 分析结果的准确性
第3章 数据行
3.1 抽象数据类型
抽象数据类型(abstract data type,ADT)是带有一组操作的一些对象的集合;
抽象数据类型是数学的抽象;
集合ADT,操作实例:添加(add)、删除(remove)以及包含(contain)
也可以只有两种操作 并(union)和 查找(find)
3.2.1 表的简单数组实现
数组
3.2.2 简单链表
链表:老鼠衔尾
第一个节点开始然后用一些后继的next链遍历
表--节点组成 加上 链next
链表:单链表、双链表(doubly linked list)
链表由一系列节点组成,这些节点不必在内存中相连;
每一个节点均含有表元素和到包含该元素后继元的节点的链(link)
我们称之为next链;
最后一个单元的next链引用null;--引用
add与remove修改引用--指向
单链表--链指向后继元;
双链表--我们的做法是,让每一个节点持有一个指向它在表中的前驱节点的链;
双链--前驱和后继相互指向;
3.3 Java Collection API中的表
3.3.1 Collection接口
Java Collection API--java.util
size();//返回集合中的项数;
isEmpty();//返回true or flase
contains();//是否包含
3.3.3 List接口、ArrayList类和LinkedList类
链表
ArrayList优点:可增长数组
get()及set()的调用花费常数时间;
缺点:
新项的插入和现有项的删除时间开销昂贵;
LinkedList优点:双链表
新项的插入和现有项的删除开销很小;
addFirst();/removeFirst();
addLast();/removeLast();
getFirst();/getLast();
有效的添加、删除和访问表两端的项;
缺点:不容易做索引--目录索引;
get昂贵;
这些额外的节点有时候叫做标记节点;
3.6 栈ADT
3.6.1 栈模型
栈(stack)是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫作栈的顶(top)
栈的基本操作push(进栈)和pop(出栈)
LIFO(后进先出)表
3.6.3 应用
平衡符号
3.7 队列ADT
队列(queue)也是表;
队列插入在一端进行而删除在另一端进行;
没有底
3.7.3 应用
排队论
第4章 树
对于大量的输入数据,链表的线性访问时间太慢;
大部分运行时间平均为O(logN);
这种数据结构叫作二叉查找树(binary search tree);
二叉查找树是两种库集合类TreeSet和TreeMap实现的基础;
4.1 预备知识
树(tree)可以用几种方式定义;
定义树的一种自然的方式是递归的方式;
根(root)
非空子树;
一条有向的边--向量
兄弟(siblings)
祖父(grandparent)
孙子(grandchild)
从节点n1到n的路径(path)定义为节点n1到n几的一个序列;
长(length)
深度(depth)
高(height)
4.1.2 树的遍历及应用
目录结构;
4.2 二叉树
二叉树(binary tree)是一棵树,其中每个节点都不能有多于两个儿子;
4.4 AVL树
AVL树带有平衡条件的二叉查找树;
旋转
4.5 伸展树
4.8 标准库中的集合与映射
4.8.1 关于Set接口
4.8.2 关于Map接口
第5章 散列
散列表(hash)
5.6 标准库中的散列表
HashSet
HashMap
第6章 优先队列(堆)
第7章 排序
插入排序
相邻的两个进行比较
第8章 不相交集类
第9章 图论算法
第10章 算法设计技巧
第11章 摊还分析