海清's profileCockhorse BlogPhotosBlogListsMore ![]() | Help |
|
|
November 04 二十世纪最好的十大算法(转载)下面是二十世纪最好的十大算法:(自http://yinyifan.com/blog/2008/10/the_most_famous_alogrithm_in_20) 20世纪最好的算法,计算机时代的挑选标准是对科学和工程的研究和实践影响最大。下面就是按年代次序排列的20世纪最好的10个算法。 1. Monte Carlo方法 2. 线性规划的单纯形方法 3. Krylov子空间叠代法 4. 矩阵计算的分解方法 5. Fortran最优编译程序 1957年,John Backus在IBM领导一个小组研制Fortran最优编译程序。Fortran的创造可能是计算机编程历史上独一无二的最重要的事件:科学家(和其他人)终于可以无需依靠像地狱那样可怕的机器代码,就可告诉计算机他们想要做什么。虽然现代编译程序的标准并不过分――Fortran I只包含23,500条汇编语言指令――早期的编译程序仍然能完成令人吃惊的复杂计算。就像Backus本人在1998年在IEEE annals of the History of computing 发表的有关Fortran I,II, III的近代历史的文章中回忆道:编译程序“所产生的如此有效的代码,使得其输出令研究它的编程人员都感到吓了一跳。” 6. 矩阵本征值计算的QR算法 7. 快速分类法 8. 快速Fourier变换 9. 整数关系侦查算法 10. 快速多极算法 关于筛法
February 27 流水作业调度-Johnson算法n个作业要在由两台机器M1和M2组成的流水线上完成加工. 每个作业i必须先在M1上然后在M2上加工, 时间分别为ai和bi 确定这n个作业的加工顺序, 使得从第一个任务开始在M1上加工到最后一个任务在M2上加工完成的总时间尽量小 Johnson算法. February 03 二分图二分图的构建:一定要分成两个互不相交的集合 判断二分图:染色法 最大匹配:匈牙利算法 最优匹配:KM算法 最大匹配数=最小点覆盖数 V:点集 M:最大匹配或最小点覆盖 U:最大独立集 关系:|M|=|V|-|U| Johnson算法求多元最短路 选图里任意一个点用bellman-ford求出到其它所有点的最短路,h[i]表示该点到i的最短路值 修改边权,w[u,v]=w[u,v]+h[u]-h[v],保证所有边为非负的 再做V次dijkstra,时间复杂度为O(V^2logV+VE) 桥 割点 双连通两个割点之间不一定是桥 桥两边不一定是割点,若不是割点肯定是“叶子节点” 没有割点<=>双连通 没有割点肯定没有桥,但没有桥不一定没有割点 稳定的线性排序计数排序: T[i]表示小于等于数值i出现的次数。在原序列中从右往左扫描,当前数值为k,则把该数直接放在新数组的第T[k]位,然后把T[K]减一,很显然这样的排序是稳定的。 对于数值很大的情况: 例如把一个8位数分成四段两位的数,从小的开始直接用计数排序,一共排4次,当大的位置不同时显然是正确的,当大的位置不同时,由于计数排序是稳定的,所以小的位置一定满足的。 基于交换的排序一个序列有n!种情况,基于交换的排序,交换k次可以判断2^k种情况 则2^k>=n! -> log(2^k)>=log n! -> k>=nlogn 所以基于交换的排序时间复杂度最好只能是O(nlogn) 稳定的排序:冒泡排序、插入排序、选择排序、归并排序 February 02 跳表一个链表的形式,每个数有个层次 一层的只能跳到相邻的一个,两层的可以跳到相邻的一个和最近的一个两层的,三层的...... 每个数的层次是random的(一层、二层、三层....按一定的比例关系) 查找时从高层开始找,若找过了就降一层 插入和删除就和普通的链表一样 o----------------------------->o o------->o------>o----------->o o-->o-->o-->o-->o-->o-->o-->o 静态二叉树静态二叉树定是离线算法 对于离线算法,可以打开文件两次 先把树建出来,用完全二叉树记录(中序遍历放数),满足二叉排序树的性质,每次插入元素就做个标记,删除元素就去掉标记,查找是第几大就直接看子树的打标记数. January 31 LCA问题并查集满足等价关系 等价关系:自反,对称,传递 Tarjan算法(需要用到并查集) 深度优先遍历,正在处理的点是指向集合是自己,处理完的点指向集合为父亲,处理完后再看它是否有询问,询问的对方点一定是处理完的点,若没处理完,则等到下次再问.若处理完,则合并,并且路径压缩. LCA问题转换成RMP问题: 按层次标号,再深度优先遍历,得到遍历序列(每个点正在处理或处理完都需打印),则LCA问题就转换成了RMP问题. 正负1RMP问题转换成LCA问题: 该序列的任何相邻数一定相差1,那么+1表示往下走一步(加一个新的儿子),-1表示往上走一步(回到父亲).当然在首尾要补数保证第一个和最后一个数是最小值.最后就可构建一棵树,这种RMP问题的询问就可以转换到这棵树上的LCA问题的询问. January 30 再说四边形不等式f[i,j]=min{f[i,k]+f[k+1,j]}+w[i,j] 用s[i,j]=k 表示决策 则s[i,j-1]<=s[i,j]<=s[i+1,j] , s[i+1,j]<=s[i+1,j+1]<=s[i+2,j+1] ...... (该结论很显然,就不证明了) 所以对于相同长度的j-i,决策总共是O(n),所有长度为j-i状态为O(n),总是件复杂度为O(n^2) 当出现类型于f[i,j]=min{f[i,k]+f[k+1,j]}+w[i,j]的DP,可以先用三方把决策s[i,j]用二维表打出来,如果行和列都是递增的,那么就可以用四边形不等式优化. January 29 RMP问题:一个序列,多次询问某段区间的最大值 f[i,k] 表示从第i个开始2^k个数的最大值 则f[i,k]=max{f[i,k-1],f[i+1,k-1]} 询问(i,j),则返回max{f[i,k],f[j-2^k,k]} (取最大的k使2^k<=j-i) 预处理 O(nlogn) 询问 O(1) January 28 生成树一个图上A到B的最优路径一定在一棵最小生成树上(最优路径:最大边最小的路径) 最小生成树一定是瓶颈生成树,瓶颈生成树不一定是最小生成树 瓶颈生成树算法: 1.最小生成树 2.二分最大边,判断是否连通 O(ElogE) January 09 关于KM
January 05 最大流的时间复杂度比较 增广路方法: 一般增广路算法 O(numU) 容量缩放增广路算法 O(nmlogU) 最短增广路算法 O(nm^2) 连续最短增广路算法(Dinic) O(n^2*m) 预流推进方法: 一般预流推进算法 O(n^2*m) 先进先出预流推进算法 O(n^3) 最高标号预流推进算法 O(n^2*sqrt(m)) December 26 中国国家集训队论文集(1999-2007)目录 国家集训队1999论文集 陈宏:《数据结构的选择与算法效率——从IOI98试题PICTURE谈起》 来煜坤:《把握本质,灵活运用——动态规划的深入探讨》 齐鑫:《搜索方法中的剪枝优化》 邵铮:《数学模型的建立、比较和应用》 石润婷:《隐蔽化、多维化、开放化——论当今信息学竞赛中数学建模的灵活性》 杨帆:《准确性、全面性、美观性——测试数据设计中的三要素》 周咏基:《论随机化算法的原理与设计》 国家集训队2000论文集 陈彧:《信息学竞赛中的思维方法》 方奇:《动态规划》 高寒蕊:《递推关系的建立及在信息学竞赛中的应用》 郭一:《数学模型及其在信息学竞赛中的应用》 江鹏:《探索构造法解题模式》 李刚:《动态规划的深入讨论》 龙翀:《解决空间规模问题的几种常用的存储结构》 骆骥:《数学模型的建立和选择》 施遥:《人工智能在围棋程序中的应用》 肖洲:《数据结构的在程序设计中的应用》 谢婧:《规模化问题的解题策略》 徐串:《论程序的调试技巧》 徐静:《图论模型的建立与转化》 杨江明:《论数学策略在信息学问题中的应用》 杨培:《非最优化算法初探》 张辰:《动态规划的特点及其应用》 张力:《类比思想在解题中的应用》 张一飞:《冗繁削尽留清瘦——浅谈信息的充分利用》 国家集训队2001论文集 符文杰:《Pólya原理及其应用》 高寒蕊:《从圆桌问题谈数据结构的综合运用》 高岳:《中等硬度解题报告》 江鹏:《从一道题目的解法试谈网络流的构造与算法》 李益明:《计算几何》 李源:《树的枚举》 刘汝佳:《搬运工问题的启示》 骆骥:《由“汽车问题”浅谈深度搜索的一个方面——搜索对象与策略的重要性》 毛子青:《动态规划算法的优化技巧》 俞玮:《基本动态规划问题的扩展》 张一飞:《求N!的高精度算法》 国家集训队2002论文集 戴德承:《退一步海阔天空——“目标转化思想”的若干应用》 方奇:《浅谈必要条件的应用》 符文杰:《排序网络》 何江舟:《用高斯消元法解线性方程组》 何林:《猜想及其应用》 黄芸:《POI0110跳舞蝇》 金恺:《浅谈网络流算法的应用》 李澎煦:《半平面交的算法及其应用》 李睿:《二分法与统计问题》 骆骥:《浅析解“对策问题”的两种思路》 孙方成:《偶图的算法及应用》 孙林春:《让我们做得更好——从的解法谈程序优化》 王知昆:《搜索顺序的选择》 许智磊:《二分,再二分!——从Mobiles(IOI2001)一题看多重二分》 杨旻旻:《构造法——解题的最短路径》 张家琳:《多项式乘法》 张宁:《遗传算法的特点及其应用》 张一飞:《由感性认识到理性认识——透析一类搏弈游戏的解答过程》 周文超:《树结构在程序设计中的运用》 国家集训队2003论文集 何林:《一类称球问题的解法》 王知昆:《浅谈用极大化思想解决最大子矩形问题》 刘才良:《平面图在信息学中的应用》 陆可昱:《长方体体积并》 雷环中:《结果提交类问题》 侯启明:《信息论在信息学竞赛中的简单应用》 刘一鸣:《一类搜索的优化思想——数据有序化》 方奇:《染色法和构造法在棋盘上的应用》 邵烜程:《数学思想助你一臂之力》 饶向荣:《病毒的DNA———剖析一道字符匹配问题解析过程》 林希德:《求最大重复子串》 张云亮:《论对算法的选择》 许智磊:《浅谈补集转化思想在统计问题中的应用》 项荣璟:《充分利用问题性质——例析动态规划的“个性化”优化》 张宁:《猜数问题的研究——《聪明的学生》一题的推广》 伍昱:《由对称性解2-SAT问题》 周源:《浅析“最小表示法”思想在字符串循环同构问题中的应用》 姜尚仆:《模线性方程的应用——用数论方法解决整数问题》 金恺:《探寻深度优先搜索中的优化技巧——从正方形剖分问题谈起》 高正宇:《答案只有一个——浅谈问答式交互问题》 国家集训队2004论文集 吴景岳:《最小生成树算法及其应用》 朱晨光:《优化,再优化!——从《鹰蛋》一题浅析对动态规划算法的优化》 杨思雨:《伸展树的基本操作与应用》 贝小辉:《浅析树的划分问题》 鬲融:《浅谈特殊穷举思想的应用》 何林:《信息学中守恒法的应用》 胡伟栋:《减少冗余与算法优化》 韩文弢:《论C++语言在信息学竞赛中的应用》 黄源河:《浅谈图论模型的建立与应用》 金恺:《极限法——解决几何最优化问题的捷径》 林涛:《线段树的应用》 李锐喆:《细节——不可忽视的要素》 栗师:《转化目标在解题中的应用》 楼天城:《匹配算法在搜索问题中的巧用》 汪汀:《最小生成树问题的拓展》 肖天:《“分层图思想”及其在信息学竞赛中的应用》 薛矛:《解决动态统计问题的两把利刃》 许智磊:《后缀数组》 周源:《浅谈数形结合思想在信息学竞赛中的应用》 朱泽园:《多串匹配算法及其启示》 国家集训队2005论文集 蒋炎岩:《数据结构的联合——块状链表》 金恺:《杂题大拼盘》 栗师:《树的乐园——一些与树有关的题目》 吴景岳:《解法讨论》 何林:《数据关系的简化》 胡伟栋:《浅析非完美算法在信息学竞赛中的应用》 黄刚:《数据结构的联合》 黄源河:《左偏树的特点及其应用》 李羽修:《Hash函数的设计优化》 龙凡:《序的应用》 潘震皓:《置换群快速幂运算研究与探讨》 钱自强:《关于遗传算法应用的分析与研究》 任恺:《图论的基本思想及方法》 唐文斌:《正难则反——浅谈逆向思维在解题中的应用》 汪汀:《参数搜索的应用》 王俊:《浅析二分图匹配在信息学竞赛中的应用》 魏冉:《让算法的效率“跳起来”!——浅谈“跳跃表”的相关操作及其应用》 杨俊:《二分策略在信息学竞赛中的应用》 杨思雨:《美,无处不在——浅谈“黄金分割”和信息学的联系》 杨弋:《从<小H的小屋>的解法谈算法的优化》 张伟达:《用改进算法的思想解决规模维数增大的问题》 周源:《压去冗余缩得精华——浅谈信息学竞赛中的“压缩法”》 朱晨光:《浅析倍增思想在信息学竞赛中的应用》 朱泽园:《回到起点——一种突破性思维》 国家集训队2006论文集 陈启峰:《“约制、放宽”方法在解题中的应用》 陈首元:《维护森林连通性——动态树》 冯威:《数与图的完美结合——浅析差分约束系统》 高逸涵:《对于一道题目的深入分析》 胡伟栋:《演讲的若干建议》 黄劲松:《贪婪的动态规划》 黄晓愉:《深度优先搜索问题的优化技巧》 贾由:《由图论算法浅析算法优化》 李天翼:《从特殊情况考虑》 龙凡:《一类猜数问题的研究》 汤泽:《浅析队列在一类单调性问题中的应用》 唐文斌:《“调整”思想在信息学中的应用》 汪晔:《信息学中的参考系与坐标系》 王栋:《浅析平面Voronoi图的构造及应用》 王赟:《Trie图的构建、活用与改进》 余远铭:《最短路算法及其应用》 俞鑫:《棋盘中的棋盘——浅谈棋盘的分割思想》 周戈林:《浅谈类比思想》 周以苏:《论反汇编在时间常数优化中的应用》 朱晨光:《基本数据结构在信息学竞赛中的应用》 朱泽园:《半平面交的新算法及其实用价值》 国家集训队2007论文集 Day1 北京 高逸涵 与圆有关的离散化 四川2 王晓珂 解析一类组合游戏 湖南 仇荣琦 欧拉回路性质与应用探究 广东 余江伟 如何解决动态统计问题 福建 杨 沐 浅析信息学中的“分”与“合” 浙江 李宇骞 浅谈信息学竞赛中的线性规划——简洁高效的单纯形法实现与应用 湖南 袁昕颢 动态树及其应用 陕西 杨 哲 凸完全单调性的加强与应用 上海 王欣上 浅谈基于分层思想的网络流算法 广东 陈启峰 Size Balanced Tree Day2 安徽 杨 弋 Hash在信息学竞赛中的一类应用 四川1 古 楠 平面嵌入 湖南 郭华阳 RMQ与LCA问题 浙江 刘雨辰 对拟阵的初步研究 湖南 陈 雪 问题中的变与不变 四川1 何 森 浅谈数据的合理组织 福建 胡伯涛 最小割模型在信息学竞赛中的应用 江苏 陈瑜希 多角度思考创造性思维——运用树型动态规划解题的思路和方法探析 安徽 周 冬 生成树的计数及其应用 广东 刘家骅 浅谈随机化在信息学竞赛中的应用 November 11 多重背包 O(V*Σlog n[i])把第i种物品换成n[i]件01背包中的物品,则得到了物品数为Σn[i]的01背包问题,直接求解,复杂度仍然是O(V*Σn[i])。 方法:将第i种物品分成若干件物品,其中每件物品有一个系数,这件物品的费用和价值均是原来的费用和价值乘以这个系数。使这些系数分别为1,2,4,...,2^(k-1),n[i]-2^k+1,且k是满足n[i]-2^k+1>0的最大整数。例如,如果n[i]为13,就将这种物品分成系数分别为1,2,4,6的四件物品。 August 26 递推式的矩阵运算形如f[n]=x1*f[n-1]+x2*f[n-2]+....+xk*f[n-k](xi为实数)的递推式 用一个k*1的矩阵表示相邻的k个数 可以通过 x1,x2,x3,...,xk-1,xk f[n-1] f[n] 来计算f[n] 1 ,0 ,0 ,..., 0 ,0 f[n-2] f[n-1] 0 ,1 ,0 ,..., 0 ,0 f[n-3] f[n-2] ... × .. = .. ... .. .. 0 ,0 ,0 ,..., 1 ,0 f[n-k] f[n-(k-1)] (k*k的矩阵) (k*1的矩阵) 当然这样计算看起来很复杂,其实矩阵的优点就在于它可以二分计算 由于矩阵运算遵循结合律,所以可以先把k*k的矩阵自乘若干次后再和前k个数组成的k*1的矩阵相乘,则可得到f[n],算一个矩阵的n次幂可通过二分快速幂的方法求解,这样的话时间复杂度就只有O(k^2logn)。 |
|
|