算法导论
文章平均质量分 51
清文
低调前行
展开
-
MIT算法导论-第7,8讲-哈希表
1.哈希函数的选择一个好的哈希函数H需要哪些特点:1.keys均匀的映射到表的槽内2.键值的分布特性应该不影响这种均匀性质选择的策略主要有两种:除法散列法 ,乘法散列法。(1)除法散列法: 定义hash函数为 h(k) = k mod mm的原则就是m选为质数且不能太接近2或者10的幂次。原因:键值的低位可能具有某种分布规律,如果选择2或者10的幂次容易出现冲突。(2)乘法散列法:设m=2^r, 计原创 2015-12-10 09:14:20 · 1029 阅读 · 0 评论 -
MIT算法导论-第11讲-动态规划
动态规划与分治方法相似,都是通过组合子问题的解来求解原问题。 分治法将问题划分为互不相交的子问题,递归地求解子问题,再将它们的解组合起来,求出原问题的解。与之相反,动态规划应用于子问题重叠的情况,即不同的子问题具有公共的子子问题(子问题的求解是递归进行的,将其划分为更小的子子问题)。在这种情况下,分治算法会做许多不必要的工作,它会反复地求解那些公共子子问题。而动态规划算法对每个子子问题只求解一次,原创 2015-11-24 21:27:17 · 545 阅读 · 0 评论 -
MIT算法导论-第12讲-最小生成树-Kruskal算法+并查集
基本思想Kruskal算法构造最小生成树的过程为:先构造一个只含 n 个顶点,而边集为空的子图,若将该子图中各个顶点看成是各棵树上的根结点,则它是一个含有 n 棵树的一个森林。之后,从网的边集 E 中选取一条权值最小的边,若该条边的两个顶点分属不同的树,则将其加入子图,也就是说,将这两个顶点分别所在的两棵树合成一棵树;反之,若该条边的两个顶点已落在同一棵树上,则不可取,而应该取下一条权值最小的边再试原创 2016-01-15 22:56:26 · 395 阅读 · 0 评论 -
算法导论-最短路径-Dijkstra算法+Bellman-Ford 算法
《算法导论》读书笔记之图论算法—Dijkstra 算法求最短路径 Bellman-Ford 算法及其优化转载 2016-01-16 21:32:48 · 522 阅读 · 0 评论 -
MIT算法导论-第五讲-线性时间排序
在比较排序算法中,在最坏情况下,都需要做Ω(nlgn)此比较。合并排序和堆排序以及随机快速排序平均情况和最坏情况下达到O(nlgn),因此合并排序和堆排序以及随机快速排序是渐进最优的。1.决策树的概念及如何用决策树确定排序算法时间的下界在比较排序算法中,用比较操作来确定输入序列《a1,a2,……,an》的元素间次序。决策树是一棵完全二叉树,比较排序可以被抽象视为决策树。在决策树中,节点表示为i:j,原创 2015-11-30 20:00:22 · 819 阅读 · 0 评论 -
MIT算法导论-第六讲-顺序统计问题
1. 最小值和最大值在一个有n个元素的集合中,需要做n−1次比较才能确定其最小(大)元素。如果要同时找出最小值和最大值,通常的做法是对每一个输入的元素都与已知的min和max作比较,这样相当于独立完成两趟查找进行2(n−1)次比较。事实上,只要记录已知的min和max,每次取2个元素进行比较,然后较小的和min进行比较,较大的和max进行比较,这样就实现了对每两个元素进行3次比较,总共只需要3⌊n/原创 2015-12-01 13:51:26 · 867 阅读 · 1 评论 -
为什么求模运算要用素数(质数)—— 哈希表设计
在设计用除法来散射的哈希表时,我们都会用数值模哈希表大小,得到的余数来作为ID存入哈希表对应格子中。所有文章都表明要用一个较大的素数来作为哈希表的大小,也就是要模一个较大的素数。但为什么就是要用素数呢?简单分析一下可以看出玄机。先看看如果用一个合数8作为哈希表大小,0-30在哈希表中的散射情况:(表1)再来看看用质数7作为哈希表大小,0-30在哈希表中的散射转载 2015-12-02 19:52:03 · 1261 阅读 · 0 评论 -
MIT算法导论-第13讲-平摊分析
总结:平摊分析是一种用来分析执行一系列类似操作的算法的工具,它对整个操作序列的真实代价限界。本章介绍了平摊分析的三种方法,分别是聚集分析、记账方法、势能方法。每种方法都通过分析栈操作和二进制计数器增1来举例分析。最后,本章用平摊分析的方法分析了表动态扩张和收缩的代价限界。 1. 聚集分析证明对所有的n,有n个操作所构成的序列的总时间在最坏情况下为T(n)。因此,每个操作的平均代价转载 2016-01-07 11:08:57 · 722 阅读 · 0 评论 -
MIT算法导论-第9讲-二叉查找树
一、二叉查找树1.定义对一颗二叉查找树的任何节点,该节点的左子树中的任何一个节点的值都小于等于该节点的值,该节点的右子树中的任何一个节点的值都大于等于该节点的值。2.删除结点叶子节点直接删除,非叶子节点选择左最大、右最小替换该节点(即左子树最小的节点或右子树最大的节点)。3.查找、插入、删除节点的时间复杂度最坏时间复杂度O(n):无左子树/无右子树一般时间复杂度O(lg原创 2016-01-07 20:43:46 · 852 阅读 · 0 评论 -
MIT算法导论-第四讲-快速排序
1.快速排序的描述快速排序算法采用的分治算法,因此对一个子数组A[p…r]进行快速排序的三个步骤为:(1)分解:数组A[p…r]被划分为两个(可能为空)子数组A[p…q-1]和A[q+1…r],给定一个枢轴,使得A[p…q-1]中的每个元素小于等于A[q],A[q+1…r]中的每个元素大于等于A[q],q下标是在划分过程中计算得出的。(2)解决:通过递归调用快速排序,对子数组A[p…q-1]和A[q原创 2015-11-28 16:38:03 · 2118 阅读 · 1 评论 -
算法导论-堆排序+优先队列
定义二叉堆是一个数组,可以被看做一个近似的完全二叉树。 性质:含有n个元素的堆的高度是lgn。在最大堆中,最大元素该子树的根上;在最小堆中,最小元素在该子树的根上。建堆,向下调整堆,向上调整堆建堆 可以使用自底向上的方法利用过程maxHeapify(向下调整堆)把数组A[1-n]转换为堆。 伪代码 向下调整堆maxHeapify 伪代码 算法描述 3.向上调整堆 代原创 2016-01-16 16:25:12 · 332 阅读 · 0 评论 -
MIT算法导论-第三讲-分治
分治法思想(1)Divide,把问题分解成子问题。(2)Conquer,递归地解决子问题。(3)Combine,合并子问题的解得到原问题的解。1.归并排序Step1:Devide——将待排序的序列分成两个子序列Step2:Conquer——(递归地)对每个子序列进行排序Step3:Combine——将排序好的子序列合并T(n)=2*T(n/2)+O(n)=Θ(nlogn)//合并已有序的a[p,..原创 2015-11-27 19:51:24 · 633 阅读 · 0 评论 -
动态规划-LIS
最长递增子序列(LIS)的问题是要找到一个给定序列的最长子序列的长度,使得子序列中的所有元素被排序的顺序增加。例如,{10,22,9,33,21,50,41,60,80} LIS的长度是6和 LIS为{10,22,33,50,60,80}。最优子结构:对于长度为N的数组A[N] = {a0, a1, a2, …, an-1},假设假设我们想求以aj结尾的最大递增子序列长度,设为L[j],那么L[j原创 2015-11-24 16:55:34 · 556 阅读 · 0 评论 -
剑指Offer-31-连续子数组的最大和
题目: 输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子树组。求所有子数组的和的最大值。要求时间复杂度为O(n)。 例如输入的数组为{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2,},因此输出为该子数组的和18 思路:动态规划 假设f(i)为以第i个数字结尾的子数组的最大和,那么f(i)=A[i], f(i-1)<=0f(i)原创 2015-11-24 15:59:05 · 267 阅读 · 0 评论 -
快速排序
1、算法思想 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。(1) 分治法的基本思想 分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。(2)快速排序的基本思想 设当原创 2015-11-24 13:21:25 · 268 阅读 · 0 评论 -
八皇后问题
#include <iostream>using namespace std;//皇后数量int num = 0;//皇后的在棋盘中的位置//数组下标代表皇后所位于棋盘的行//所在下标对应数组中的值代表皇后所位于棋盘的列int x[100];//排列解的个数int sum = 0;//判断皇后所在位置是否合法//与前面已排好位置的皇后进行条件检验bool place(int t) {原创 2015-11-23 17:31:58 · 200 阅读 · 0 评论 -
递归分析
漫谈递归:递归的思想 用归纳法来理解递归 漫谈递归:递归需要满足的两个条件转载 2015-09-27 17:25:43 · 846 阅读 · 0 评论 -
动态规划-钢铁切割
钢条切割问题Serling公司购买长钢条,将其切割为短钢条出售。切割工序本身没有成本支出。公司管理层希望知道最佳的切割方案。假定我们知道Serling公司出售一段长为i英寸的钢条的价格为pi(i=1,2,…,单位为美元)。钢条的长度均为整英寸。图15-1给出了一个价格表的样例。 钢条切割问题是这样的:给定一段长度为n英寸的钢条和一个价格表pi(i=1,2,…n),求切割钢条方案,使得销售收益r原创 2015-11-24 21:21:48 · 764 阅读 · 0 评论 -
MIT算法导论-第一讲-算法分析
1.算法的定义算法就是定义良好的计算过程,它取一个或一组值做为输入,并产生一个或一组值做为输出。算法就是一系列的计算步骤,用来将输入数据转换成输出结果。 已排序为例 - 输入:由n个数构成的一个序列《a1,a2,…,an》 - 输出:对输入序列的一个排列(重排)《A1,A2,…,An》2.算法的运行时间对于运行时间,需要考虑的因素有如下三个:a、数据的输入情况。例如,对于插入排序算法来说,原创 2015-11-25 20:53:17 · 1960 阅读 · 0 评论 -
MIT算法导论-第二讲-渐进符号,递归及解法
1.渐进符号Θ符号,f(n) = Θ(g(n)),表示f(n)的复杂度既大于等于g(n)的复杂度,又小于等于g(n)的复杂度,即于g(n)的复杂度相当。O符号,f(n) = O(g(n)),表示f(n)的复杂度最多与g(n)一个数量级,即小于等于。Ω符号,f(n) = Ω(g(n)),f(n)的复杂度最少与g(n)一个数量级,即大于等于。 o符号,f(n) = o(g(n)),表示f(n)的复原创 2015-11-26 21:14:46 · 2094 阅读 · 0 评论 -
MIT算法导论-第12讲-最小生成树-Prim算法
问题定义输入:无向图G=(V,E),每条边有一个权重,另假设所有权值是不同的输出:一棵生成树,连接了所有顶点,权重总和最小。分析过程(http://www.cnblogs.com/numbersix/p/4909750.html)MST拥有最优子结构:去掉MST的一条边,MST分裂成两个子树T1、T2,则T1、T2分别是子图G1、G2的MST。子图G1只包含T1的顶点, 子图G2只包含T2的顶点,原创 2016-01-15 22:02:49 · 1832 阅读 · 0 评论 -
MIT算法导论-第10讲-2-3树、红黑树
(本讲内容属于算法第四版,未参照算法导论上的内容)。平衡查找树之二三树(http://blog.csdn.net/caipeichao2/article/details/30089151)平衡查找树的目标是实现查找、插入、删除操作在最坏情况下的复杂度均为logN。本节将介绍二三查找树。二三树中有两种节点:二节点对应一个键,有两个子节点原创 2016-01-09 10:36:53 · 594 阅读 · 0 评论