220 likes | 409 Views
上帝掷 色子 吗. 谢其哲. Introduction. 上帝掷 色子 吗 -> 随机和 概率 能力 : 1. 很大 概率上的正确 解 2. 较 优 解 3. 期望时间 复杂 度 很好的正确解 效果好. 最好写的平衡树 Treap. 期末时当你开始预习数据结构的平衡树是什么感受? AVL , 红黑, AA …… What the f* ck are these ugly trees? 被吓倒了? 来看看居家旅行杀人越货必备之平衡树: Treap. 最好写的平衡树 Treap. 堆 + 排序 二叉树 权 值: key, aux 。
E N D
上帝掷色子吗 谢其哲
Introduction • 上帝掷色子吗 ->随机和概率 • 能力: • 1.很大概率上的正确解 • 2.较优解 • 3.期望时间复杂度很好的正确解 • 效果好
最好写的平衡树Treap • 期末时当你开始预习数据结构的平衡树是什么感受? • AVL,红黑,AA…… • What the f*ck are these ugly trees? • 被吓倒了? • 来看看居家旅行杀人越货必备之平衡树:Treap
最好写的平衡树Treap • 堆+排序二叉树 • 权值:key, aux。 • Key:左子树≤根≤右子树(排序二叉树) • Aux: 根≤左子树,右子树(堆)
最好写的平衡树Treap • 插入:根据key找到插入的位置 • 随机生成aux,旋转调整
最好写的平衡树Treap • Insert(I, k) • If (i==0) • 新建点,aux[i] = rand() • If (k < key[i]) • Insert(l[i], k) • If (aux[l[i]] < aux[i]) right(i) • Else • Insert(r[i], k) • If (aux[r[i]] > aux[i]) left(i)
最好写的平衡树Treap • Delete差不多,只有单旋 • 期望高度:O(logn) • 平均复杂度:O(logn)
素数判定Miller-Rabin算法 • O() -> O(logn) • 费马小定理: • (p为素数, a<p) • 二次探测定理: • 若 • P为合数时,x取值有很多,如
素数判定Miller-Rabin算法 • 令,d为奇数 • 若或,则称p通过以a为底的素性测试(为素数)。 • 原理:若p为素数,则 • 考虑数列. 最后一位是1,每一位是前一位的平方%p,设数列最后一个1的前一个是x,若x≠-1则p为合数。 • 例子:a=2, p=13,p-1=12= • 数列:8, 64%13=12, 144%13=1
素数判定Miller-Rabin算法 • 素数一定会通过测试 • 合数有1/4的概率通过测试 • 取6次不同的底a,误判率不到千分之二 • 取内无误判。
判断A*B=C? • Problem: 给定A,B,C(n*n的矩阵),判断是否A*B=C • 随机生成D(1*n的矩阵),判断是否D*A*B=D*C
平面最近点对 • O(logn) • 两点距离≥X值的差 • 解1: (对随机数据效果很好) • 把输入的点按x从小到大排序 • For i = 1 to n • for j = i + 1 to n • if (x[j] – x[i] < ans) • ans = min(ans, distant(i, j)); • else break;
平面最近点对 • What if?.... • 出题人太ws,测试数据中点的x比较接近
平面最近点对 • 改进: • 投影到一个随机的向量上,两点距离≥投影点距离 • 按投影位置排序,投影点距离≥ans,则break • 出题人卡不到
平面最小三角形 • 给定N个点,求一个以其中三个点为顶点的三角形,使其周长最小。 • 传统算法:O(nlogn),难写,常数大 • O(n^3) • 随机向量投影,O(n^3)+break比O(nlogn)快
费马点问题 • 给定n个点,求一个点到这n个点的距离和最小。
费马点 • 爬山算法: (求局部最优解) • 随机设置一个初始点b,设置初始步长T • While T>T_min • Flag=false • For i = 1 to k • 生成长度为T的随机向量v • If b+v优于b • b=b+v, flag=true • If (flag == false) T=T*0.8
模拟退火 • 原理:热力学退火过程,给固体设置一个充分高的温度,温度高时,原子容易脱离原位置做自由运动。再让其慢慢冷却。冷却时原子会趋向内能最小的地方,但也有一定概率去内能较大的地方,直到温度足够低。 • 流程: • 初始温度T,初始解S,每次迭代次数L,降温系数p • While T>T_min • Flag=false • For k = 1 to L • 随机长度为T的增量D,S’=S+D • 计算df=f(S’)-f(S) • df>0时(变优了)接受解S’, flag=true • df<0时(变差了)以接受解S’ • If (flag==false)T=T*p
最小正方形覆盖(poj3301) • 枚举正方形一条边的角度,计算最小需要的边长。 • 初始温度T=pi/2, 角度S=0,每次迭代次数L=20, 降温系数p=0.5 • While T>1e-8 • Flag=false • For k = 1 to L • t = T * (-1到1中的一个随机数) • df=f(S)-f(S+t) (f(S)为一条边角度为S时最小正方形边长) • df>0时接受解S’,flag=true • df<0时 以接受解S’() • If (flag==false)T=T*p
遗传算法 • 原理:达尔文进化论和遗传学机理 • 有n个个体(DNA序列),按照适应度(权值)从高到低排序。 • 繁殖:选出两个个体,以高概率选择适应度高的,低概率选择适应度低的,以一定概率P交配得出两个新个体代替原来的老个体,新个体的DNA是老个体DNA的组合。 • 突变:以一定概率随机改变序列的一到两位。 • 重复 • 适应度高的个体得到保存,适应度低的个体淘汰。
拓展 • 遗传算法与蒙娜丽莎 • TSP问题->模拟退火