算法导论
xiangzhang321
如果今天不走快一点,那么明天就要用跑的了
展开
-
算法导论学习笔记(3)---计数排序
计数排序是一种算法复杂度 O(n) 的排序方法,适合于小范围集合的排序。比如100万学生参加高考,我们想对这100万学生的数学成绩(假设分数为0到100)做个排序。我们如何设计一个最高效的排序算法。本文不光给出计数排序算法的传统写法,还将一步步深入讨论算法的优化,直到时间复杂度和空间复杂度最优。计数排序是一个类似于桶排序的排序算法,其优势是对已知数量范围的数组进行排序。它创建一个长度为这个数据原创 2012-04-29 15:23:10 · 423 阅读 · 0 评论 -
算法导论学习笔记(13)——二项堆
一颗二项堆由一组二项树组成,二项树Bk是一种递归定义的有序树,B[k]是由两棵B[k-1]二项树组成,其中一颗树是另外一颗树的子树。下面(b)是B0 - B4的二项树:(a)表示二项树Bk的递归定义,三角形表示有根的子树(c)以另一种方式来看二项树Bk显然二项树具有如下的性质:1. 对于树B[k]该树含有2^k个节点;2. 树的高度为k;3. 在深度为原创 2012-05-03 23:13:34 · 1057 阅读 · 1 评论 -
算法导论学习笔记(1)---堆排序
#include using namespace std;/*交换*/void swap(int &a, int &b){ int temp = a; a = b; b = temp;}/*调整堆节点,节点值大的"上浮" 小的"下沉"时间复杂度为O(lgn)n 堆的大小index 要调整的节点*/void maxHeapify(原创 2012-04-19 10:23:01 · 476 阅读 · 0 评论 -
算法导论学习笔记(16)——图的基本算法
一、图的表示:有两种方法:(1)邻接矩阵:在非稀疏图中,这种表示法简单高效。比如图有n个节点,矩阵大小就是NxN的M,M[i,j] 可以用来表示节点i到节点j的权等等。这种表示法使用起来相当的灵活,缺点是不管图的信息如何,其空间代价都是NxN的,开销较大。(2)邻接表:这是专门为稀疏图所准备的,也使我最喜欢的表示方法,因为我总感觉这种表达方式尊重了图的信息,比较有感觉。首先,可以用一个原创 2012-05-04 20:59:08 · 587 阅读 · 0 评论 -
算法导论学习笔记(14)——斐波那契堆
斐波那契堆同二项堆一样,也是一种可合并堆。斐波那契堆的优势是:不涉及删除元素的操作仅需要O(1)的平摊运行时间(关于平摊分析的知识建议看《算法导论》第17章)。和二项堆一样,斐波那契堆由一组树构成。这种堆松散地基于二项堆,说松散是因为:如果不对斐波那契堆做任何DECREASE-KEY 或 DELETE 操作,则堆中每棵树就和二项树一样;但是如果执行这两种操作,在一些状态下必须要破坏二项树的特征,比转载 2012-05-04 11:27:16 · 3925 阅读 · 0 评论 -
算法导论学习笔记(15)——用于不相交集合的数据结构
用于不相交集合的数据结构总结:这一章讲了并查集的相关概念,以及主要的MAKE-SET, UNION, FIND-SET操作,并给出了并查集的链表表示和森林表示方式。1. 不相交集合上的操作不相交集合数据结构保持一组不相交的动态集合,每个集合通过一个代表来标识,代表即集合中的某个成员。一些操作:MAKE-SET(x): 建立一个新的集合,其唯一成员为x。UN转载 2012-05-04 14:51:45 · 1847 阅读 · 0 评论 -
算法导论学习笔记(17)——最小生成树
给定一个带权的无向连通图,如何选取一棵生成树,使树上所有边上权的总和为最小,这叫最小生成树.求最小生成树的算法(1) 克鲁斯卡尔算法图的存贮结构采用边集数组,且权值相等的边在数组中排列次序可以是任意的.该方法对于边相对比较多的不是很实用,浪费时间.(2) 普里姆算法图的存贮结构采用邻接矩阵.此方法是按各个顶点连通的步骤进行,需要用一个顶点集合,开始为空集,以后将以连通的顶点陆续原创 2012-05-05 10:53:39 · 645 阅读 · 0 评论 -
算法导论学习笔记(18)——单源最短路径(Dijkstra算法实现)
Dijkstra算法的基本思想是:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径v,···vk,就将vk加入到集合S中,直到全部顶点都加入到S中,就结束了),第二组为其余未确定最短路径的顶点集合(有U表示),按最短路径长度的递增顺序依次把第二组的顶点加入到S中,在加入的过程中,总保持从源点v到S原创 2012-05-05 21:37:04 · 1102 阅读 · 0 评论 -
算法导论学习笔记(19)——每对顶点间的最短路径(基于Floyd_Warshall算法)
Floyd-Warshall算法的运行时间为Θ(V3),它同样允许存在负权边,但假设不存在负权回路。该算法考虑的最优子结构与上述描述类似,即最短路径的子路径是最短路径。但是,它对中间路径的范围加以限制,使其增长与最短路径的最大边数的增长同步。令dij(k)=为从顶点i到顶点j、且满足所有中间顶点属于集合{1,2,…,k}的一条最短路径的权值,定义递归解:如果k=0,dij(k)=wij;如果k≥1原创 2012-05-07 20:49:10 · 1368 阅读 · 0 评论 -
算法导论学习笔记(12)——B树
前言: 动态查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树(Balanced Binary Search Tree),红黑树(Red-Black Tree ),B-tree。前三者是典型的二叉查找树结构,其查找的时间复杂度O(log2N)与树的深度相关,那么降低树的深度自然会提高查找效率。 但是咱们有面对这样一个实际问题:就是大规模数据转载 2012-05-02 23:28:24 · 794 阅读 · 0 评论 -
算法导论学习笔记(8)——动态规划之矩阵链乘法
【问题描述】给定有n个连乘矩阵的维数,要求计算其采用最优计算次序时所用的乘法次数,即所要求计算的乘法次数最少。例如,给定三个连乘矩阵{A1,A2,A3}的维数分别是10*100,100*5和5*50,采用(A1A2)A3,乘法次数为10*100*5+10*5*50=7500次,而采用A1(A2A3),乘法次数为100*5*50+10*100*50=75000次乘法,显然,最好的次序是(A1A2原创 2012-05-01 22:17:05 · 1339 阅读 · 1 评论 -
算法导论学习笔记(7)——动态规划之装配线调度
装配线问题如下: Colonel汽车公司在有两条装配线的工厂内生产汽车,一个汽车底盘在进入每一条装配线后,在每个装配站会在汽车底盘上安装不同的部件,最后完成的汽车从装配线的末端离开。如下图所示。 图1 装配线示意图 每一条装配线上有n个装配站,编号为j=1,2,...,n原创 2012-04-30 20:48:59 · 740 阅读 · 0 评论 -
算法导论学习笔记(2)---快速排序
快速排序快速排序平均复杂度是nlogn,记录一下快速排序的思路:1.分治的思想,把数组分成两份,两份分成4分,这样分到足够小,就能很好排序咯,然后把他们合起来,排序完成。2.该分治思想和合并排序思想一样,但是处理上更搞一筹,他是把小的和大的分成两份,这样在最后合并的时候,就不会像合并排序那样还要检查,因为本来就是左边比右边小,所以可以做到原地排序(就是不用申请多余的空间)。3.如何转载 2012-04-29 14:46:05 · 383 阅读 · 0 评论 -
算法导论学习笔记(5)——二叉查找树
#includeusing namespace std;struct BSTree{int data;BSTree *left;BSTree *right;};//标记在插入时,如果已存在,则为true ,表示不需要插入,否则为falsebool flag = false;int a[100];//查找操作BSTree *search(BSTree转载 2012-04-29 21:32:49 · 342 阅读 · 0 评论 -
算法导论学习笔记(4)——利用链接法实现哈希表
常用的解决哈希冲突的方法有两种:一、开放定址法:开放定址法是一类以发生冲突的哈希地址为自变量,通过某种哈希冲突函数得到一个新的空闲地址的方法。在开放定址法中常用的有线性探查法和平法探查法;线性探查容易产生堆积问题。而平方探查法可以解决堆积问题,但不能探查到哈希表上的所有单元,但至少能探查到一本单元二、拉链法:拉链法是把所有的同义词用单链表链接起来的一种方法,与开放定址法相比有以下优点:原创 2012-04-29 20:58:11 · 957 阅读 · 0 评论 -
算法导论学习笔记(9)——动态规划之最长公共子序列
【问题】 求两字符序列的最长公共字符子序列问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列。令给定的字符序列X=“x0,x1,…,xm-1”,序列Y=“y0,y1,…,yk-1”是X的子序列,存在X的一个严格递增下标序列,i1,…,ik-1>,使得对所有的j=0,1,…,k-1,有xij=yj。例如,X=“ABCBDAB”,转载 2012-05-01 22:21:51 · 1028 阅读 · 0 评论 -
算法导论学习笔记(11)——贪心算法之哈夫曼树
详细的贪心算法讲解可参看http://www.cnblogs.com/chinazhangjie/archive/2010/11/23/1885330.html 贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他原创 2012-05-02 09:45:39 · 6442 阅读 · 0 评论 -
算法导论学习笔记(10)——动态规划之最优二叉查找树
问题描述(详见算法导论P212-P213)对于给定关键字序列,构造一颗最优的二叉查找树T,使得在T内的一次搜索的期望代价最小前提概念一颗最优二叉树不一定是一颗整体高度最小的树;也不一定总把具有最大概率的关键字作为根节点二叉查找树的子树必定包含连续范围内的关键字当一颗树成为一个节点的子树时,它的期望代价增加值为该树中所有概率的总和最优子结构设包含有序关键字转载 2012-05-01 23:11:14 · 2479 阅读 · 1 评论 -
算法导论学习笔记(20)——最大流
一,概念1)流网络:简单有向图,且有两个特别的顶点(源点s,汇点t)2)流的边标识为f(u,v)/c(u,v),流量/容量3)流的三个性质:1>容量限制 对于所有边 流量2>反对称性 f(u,v)=-f(v,u)3>流守恒性 正向流与反响流之和为零4)割:流网络G=(V,E)的割(S,T)将顶点V划分为S和T=V-S两部分,定义割的容量为C(S)割这条线上S中顶点到T中顶点原创 2012-05-07 22:02:57 · 3376 阅读 · 0 评论