1、课程介绍干晓聪 15626013626 南海楼 308sina 微博 资料下载 通知116 周教学 1718 周复习答疑 1920 考试周考试卷面 60% 考平时所讲知识点 不考编程 考前有复习题库平时成绩 40% 作业=上机实验 自选题目交十次,或大作业(需同意)上机:南海楼 209 每周四下午 14:0016:00 Java 16:0018:00 数据结构交作业,可在宿舍做上课出勤课程定位:计算机基础 = 编程语言 = 数据结构 = 算法 = 复杂性理论,专题方向横向扩充,纵向深入教材 参考书 做题 学习方法:编程基础是前提,自学最重要收集:面试题,算法题,编程题,智力题引论一些数学公式
2、估计调和级数前 n 项 1/x 积分得对数 1/x 和 1/(x+1)所夹估计误差 前若干项精确计算,后面误差小 P10 题 1.7P10 题 1.8P10 题 1.9 Fibonacci 数的通项:母函数,z 变换计算机中的数进制转换:Dec Bin Hex Oct整数转换:Dec Int = Bin 模二 任意进制带权相加:Bin Int/Float = Dec 任意进制浮点数除法:4/3 转二进制 任意进制二进制的乘除法 x*3整数编码:补码浮点数编码:IEEE 754,二进制科学计数法,能表示的浮点数个数是有限的,能表示的浮点数的精度是有限的,浮点数在数轴上的分布是不均匀的。HEX 1
3、6 进制编码符号+指数 纯小数有效数字 指数 实际表示 名称 说明0000000000000 00000000000001 2-1022*2-52 subnormal min000FFFFFFFFFFFFF 2-1022 *(1-2-52) subnormal max001 0000000000000 1+0 -1022 2-1022 realmin线性区3CB 0000000000000 1+0 -52 2-52 eps 精度,HEX 0.00000000000013FF 0000000000000 1+0 0 13FF FFFFFFFFFFFFF 2-eps 0 2-eps 屏幕显示 2.
4、0000.400 0000000000000 1+0 1 2 屏幕显示 2400 8000000000000 1+1/2 1 37FE FFFFFFFFFFFFF 2-eps 1023 (2-eps)*21023 realmax7FF 0000000000000 inf x/07FF xxxxxxxxxxxxx NaN 0/0; 一般 FFF 8000000000000考虑 -0,-infMatlab 演示 format long format hex format short format1 / 0 = inf0 / 0 = NaN运算时阶码调整/对齐 1/2 4+11+eps = HEX
5、3FF 00000000000012+eps = HEX 400 0000000000000浮点数的误差:x=1+eps, x-1 x=2+eps, x-2x=4/3-1, y=3*x, z=1-y程序中的数据数组:下标指针:地址;内存看作巨大的字节数组,下标结构;首地址+偏移= 实际地址本质上都是地址/指针内存,磁盘:巨大数组 段页式/扇区、簇、文件分配 碎片算法分析时间复杂度1 lnln1n12nl2nn!nfor ( int i = 0; i =0 ,反向积分就一定找前一半判断素数 P28 题 2.13筛素数 P28 题 2.14 估计:第 n 个素数 ,前 n 个自然数中素数量 ,时间
6、lln其中l1l23571lknnpk 1lldxk因子 素因子找多数:http:/ 首先证明,在存在严格多数的元素(主要元素,过半数的元素)的前提下,算法得到此元素。分段,m=0 作为每段起点。除最后一段外,前面各段:起点元素在段内恰占一半(起点元素看作+1,其它元素看作-1,段到 m=0 结束)。所以,前面各段,每段内主要元素最多占一半。所以,前面总起来,主要元素最多占一半。所以,最后一段,主要元素过半。如果最后一段起点不是主要元素,矛盾。再加上验证,就是完整的算法。P28 题 2.19 复杂且慢些。列表功能读 写取 查 增 删 改其它getElementAtgetSubList(last
7、)indexOfElementindexOfSubListindexOfMaxindexOfMinaddAtaddAllAtremoveAtremoveRangesetAt length/sizecompareTogetFirstgetLastcontainsElementcontainsSubListgetMax / getMingetRandomaddFirstaddLastremoveFirstremoveLastremoveAllremoveAllEqualsclearfillswapisEmptyequals实现ADT P31基于定长数组的列表 对应的时间复杂度基于增长数组的列表链表
8、 单向链表 双向链表 循环链表 P38 静态链表 P43列表的变化:栈 stack FILO P46 两种实现 队列 queue FIFO P58 元素循环数组循环:基于循环增长数组的双端队列 Dequeue P58题一元多项式加减乘除 P39基数排序 P41稀疏矩阵三元组 转置 乘法每行/列作为一个列表 转置 乘法十字链表:P42 转置 乘法 高效遍历每行/列学生、课程 P42多对多映射/二分网的快速互查实际设计:两个类,对象含列表括号匹配计数 多种括号 P52字符串数字表达式求值P62 题 3.7 涉及快速卷积P62 题 3.8 整数次幂大整数 加减乘除P62 题 3.9 计算出 2400
9、0 是多少即可 整数次幂Josephus 问题:递归 http:/ P63 题 3.10模拟:不论数组/链表,需定位删除,时间复杂度 m*n,min(m,n)*nn 个人编号0,n-1,从 0 号开始报数0,m-1,报数为 m-1 者离开,从下一个人开始重新从 0 开始报数。对 f(n,m),第一个离开者的编号为 (m-1)%n,下一个人编号为 m%n,从他开始重新从 0 开始报数。现在总人数 n-1,从他开始从 0 编号的话,最终留下者编号为 f(n-1,m),对应原问题编号(f(n-1,m)+m%n)%n,化简得 f(n,m)=(f(n-1,m)+m)%n,时间复杂度 n反转单链表 P63
10、 题 3.12P63 题 3.15P64 题 3.22a 记录迄今为止最小值b 不能小于 lnN,否则就可以通过此方法得到小于 lnN 的基于比较的排序方法了P63 题 3.23 数组模拟内存指针树概念图 结点/节点 边 有向 无向 度树 度 根 叶 层/深度 子/子树/子孙 亲/祖先 兄弟 结点数=边数+1二叉树 左/右子 叶子数=度 2 数+1满(理想平衡树) 完全 平衡树/森林二叉树实现结构体+指针 P66嵌套列表/广义表邻接矩阵遍历打印目录文件 P67个数 总大小 平均大小 深度 最大 最小 P69二叉树 三序遍历表达式 前缀 中缀 后缀字符串算式构造表达式树:拆分 无运算优先级无括号
11、 有运算优先级 有括号 参考 P71已知其中两序求原树 证明三序遍历/深度优先遍历:递归 通用非递归广度优先遍历/层次遍历:通用非递归树的广度优先遍历 深度优先遍历二叉查找树(二叉排序树)FindMin FindMax Find P74Insert P75Delete P76 P77删除结点无子结点,即叶结点:直接删除有一子:顶替有二子:改为(递归)删除左子树最大值/右子树最小值,也可以用来处理有一子的情况懒惰删除 P77随机生成的二叉查找树最坏情况下树深度/结点平均深度 O(n):递增或递减序列最好情况下树深度/结点平均深度 O(ln n):平衡树随机生成的二叉查找树,平均情况下树深度/结点
12、平均深度 O(ln n) : P781、任何插入序列等概率,即前 n 个自然数1,n的全排列;并非所有可能的树等概率,可能的树和全排列并非一一对应。2、随机生成的二叉查找树所有节点深度之和 为一随机变量=左子树深度和 +右子树深度和nXnY+n-1。根节点深度 0。nZ3、插入序列首数就是树根,是随机的,均匀分布1,n。对某个给定的首数 m,左子树所含结点即前 m-1 个自然数1,m-1 。4、下面说明,在原问题中,若给定首数 m,则左子树的所有节点深度之和就是 。原插入1X序列是前 n 个自然数全排列等概率,考虑其中首数为 m 的序列,在这样的序列中,前 m-1 个自然数的每一个排列是等概率
13、的,因为前 n 个自然数的全排列可以分三步产生:选择 m-1 个位置放前 m-1个自然数;排列这 m-1 个自然数;排列剩下的自然数。只要其它两步确定了,中间一步总是前 m-1个自然数的全排列。5、同理可说明,在原问题中,若给定首数 m,则右子树的所有节点深度之和就是 。nmX6、 ,其中 均匀随机地取 , 对应取 。1nXYZnY01,nX Z10,7、 ,其中 ,得到nEE10nkEYX, ,递推公式简记为102nkX102nkXnkE8、 仿照 P184 推导AVL 树:基本平衡的二叉查找树越平衡查找越快 O(ln n)严格平衡:极端情况下插入慢,例如末端缺一个结点,首端插入;平均情况类
14、似 B 树AVL 定义 P80-81AVL 插入时调整:从插入节点向上找第一个不平衡节点 P82-86AVL 删除完整过程:插入/删除后更新路径上每结点层数信息从插入/删除节点向上找第一个不平衡节点若未找到,结束若左层数=右层数+2若左左层数=右层数+1 则为 LL 型若左右层数=右层数+1 则为 LR 型若右层数=左层数+2若右右层数=左层数+1 则为 RR 型若右左层数=左层数+1 则为 RL 型assert 断言查/增/删时间复杂度 O(ln n)红黑树http:/zh.wikipedia.org/wiki/红黑树性质 注意空指针为黑插入:新结点 N 初始为红,记 N 父 P,爷 G,叔
15、 UP 不存在 / N 为根 / 空树:直接 N 变黑 wiki 情形 1P 存在P 黑:OK wiki 情形 2P 红,故 G 存在、非空、黑,U 存在U 红:UP 变黑,G 变红;对 G 递归;四种形状都一样。 wiki 情形 3U 黑NPG 成之字形:N 提升,成为下面情况 wiki 情形 4NPG 成一字形:P 提升变黑,G 变红 wiki 情形 5删除:要删除某(非空)结点 X。若 X 有 2 个非空儿子,则复制左儿子最大值(或右儿子最小值)Y 到 X,改为删除 Y。所以只需讨论下面情况:要删除某结点 X,X 有(至少)1 个儿子为空。记另一个儿子为 N(可能也为空)。此时,删除 X
16、 即去掉 X,把 N 上升到 X 处,即用 N 代替 X。如果 X 红,删除后 OK。如果 X 黑 N 红,删除后 N 变黑即 OK。所以下面只需讨论 X 黑 N 黑的情况,此时删除后,N 子树缺了一个黑,需要调整。对删除后的树,记 N 父 P,兄弟 S,左侄 L,右侄 R。由于对称性,不妨设 N 兄(左儿子)S 弟。P 不存在 / N 为根:OK wiki 情况 1P 存在,由删除前的图黑色均衡可知,S 存在非空, LR 存在(可能为空)S 红:S 提升,PS 交换颜色,成为下面情况 wiki 情况 2,注意 PLR 必黑,图不准,LR可能为空S 黑R 红: S 提升,PS 交换颜色,R 变
17、黑 wiki 情况 6R 黑L 红:只看 S 子树,L 提升,LS 交换颜色,成为上面情况 wiki 情况 5L 黑P 红:PS 交换颜色 wiki 情况 4P 黑:S 变红,改为调整 P wiki 情况 3伸展树了解 P90-93B 树系列分裂与合并 http:/ 已很快红黑树实际效率高,一般有现成类库数据大到内存装不下,数据库 B 树数据操作读多写少,因为大量的写操作往往批量完成(实时更新少),此时可使用快排等散列 Hash原理(按某规则)排序后查找:字典,黄页 O(ln n)Hash 查找:电话号码,人名Hash 函数的构造散列值均匀分布手机号码后四位、末位、前四位、首位人名首字母、末字
18、母字符串字母和 P112字符串前三个字母 P112推荐 Hash 函数: ,其中 m 常取 31, 33, 37 P11211*kkhme插入 查找 删除 O(1)冲突插入时冲突的解决方法拉链 P113Java 中的 Object.hashCode() HashMap 拉链 HashTable HashSet开放定址 P117 删除的问题线性探测 P117平方探测 P118补充: 互素=数列 模 q,不重复地占满 。若有重复,假设,pq0,12,3.1pp0,1q,其中 ,则 含 q 因子,显然 不能含 q 因子。%ijijqjiji双 Hash P122大数据量re-hash 太满时做 P1
19、23可扩散列 P125 均匀分布时效果好,否则索引项太多 实际中一般固定使用一个较长的hash 码海量网页文件的存储与访问:对 url 进行 hash,hash 码较长;存储文件含 url;分布式存储节点;多个对外服务节点,同步含 hash 码=存储节点映射;访问用户增加引起对外服务节点增加;节点文件数量增加引起存储节点增加,文件存储位置发生变化,使用双映射配置文件逐步转移文件。字符串查找暴力法 JavaHash 法 K.M.P.B.M.堆/优先队列定义:二叉完全树,堆序数组实现:父子节点下标公式 P134插入:末尾上移 P136删除:交换后根下移 P138初始化堆:O( n ) P141左式
20、堆:P145左式堆合并:大根与小根右子(递归)合并(并调整根)P159 题 6.9aP159 题 6.7b排序选择排序冒泡排序插入排序 P165Shell 排序 P167 先 p 排序,再 q 排序,仍然是 p 排序 pq平衡排序树排序堆排序 P170归并排序 P173快速排序 P177 小数组 P181 分析 P183外部排序:内部排序+多路归并桶排序 P189基数排序排序的稳定性 P196 题 7.25不稳定:选择 Shell 堆 快排解决稳定性的通用方法:增加比较字段基于比较的排序时间下界 P187P196 题 7.3413 球问题补 P64 题 3.16f选择问题/中位数 P185小数
21、据量:排序;快速选择大数据量:外排等价关系(不相交集)像素图片的同色联通集逐行扫描的像素图片的同色联通集;老乡关系等价关系判断;等价类划分类树 数组表示 P201小树添加到大树根 P204路径压缩 P205图定义 P215表示 P216 结点指针 嵌套列表 矩阵拓扑排序 P217可拓扑排序 无圈 = 存在结点入度 0可拓扑排序 = 无圈:反证无圈 = 存在结点入度 0:反证,去掉出度 0 的结点,构造圈无圈 = 可拓扑排序深度优先遍历 递归广度优先遍历 列表无权图单源最短路径 广度优先遍历 P220有权图单源最短路径 Dijkstra P225无圈图 P230关键路径 P230Floyd 算法
22、 原理 结果双矩阵 最短路径的存储物理方法求两点间最短路最大流 P233 反向撤销 P235最小生成树将结点任意划分为两部分,连接两部分的最小边必在最小生成树上,否则就可以用此边降低最小生成树。Prim 搭桥 证明:记最小生成树 M,Prim 生成树 P。反证,若 M=p。若 mp,将 M 中 m 替换为 p,得到更小生成树,矛盾。若 m=p,将 M 中 m 替换为 p,继续证明过程,最终必会碰到 mp 的情况。Kruskal 加边避环 证明:wiki求割点 P242一笔画/欧拉圈 P247了解:割边 强连通分量 Tarjan 算法 Kosaraju 算法 P249贪婪法找钱 P263任务调度
23、:总等待时间最少 = 短作业优先Huffman 编码 P266 证明 P269装箱问题 P270 首次适合 P272 最佳适合 P273 先排序 P274分治法P277 公式最近点 P279中位数 P281整数乘法 P284矩阵乘法 结果矩阵每个元素需要 n 次乘法和 n-1 次加法32nma矩阵分块乘法 时间不变 可利用 cache 可并行Strassen 矩阵乘法 P285 http:/zh.wikipedia.org/wiki/施特拉森算法动态规划阶段网最短路径求 Fibonacci 数的递归程序效率及改进 P288矩阵乘法的顺序安排 P289最优二叉查找树 P291Floyd 算法 P294随机数标准随机数发生器:产生 32 位随机整数标准库:产生 U0,1)逆变换法:产生指数分布取舍法:产生幂律分布,正态分布Box-Muller 变换产生正态分布搜索棋类游戏胜负是确定的穷举 华容道 n2 数码 五子棋 魔方对称回溯A*搜索剪枝经验估计剪枝、优先搜索方向MISC最长公共子串问题后缀串排序全文查找快速自动作文各参考书异或棋FFTJava.lang.Integer 位算法组合数学 组合的生成回音消除 Levinson 算法维特比算法