算法
文章平均质量分 74
hola_f
这个作者很懒,什么都没留下…
展开
-
小白进阶之贪心算法-活动选择问题
问题描述:给定活动集合,包括活动i的开始时间si和结束时间fi,求最大兼容活动子集。i1234567891011si130535688212fi4567991011121416问题的解法有原创 2016-06-28 10:56:18 · 334 阅读 · 0 评论 -
算法导论-图的搜索算法之深度优先搜索和广度优先搜索
图的搜索算法的目的是发现从源结点s能够到达的每个顶点和相应的距离。广度优先搜索:所有结点一开始涂上白色,第一次遇到一个结点就称该结点被发现,颜色变为黑或者灰。黑色代表所有与该结点邻接的结点都已经被发现,灰色代表的是已知和未知两个集合的边界。白->灰:结点刚被搜索到,灰->黑:结点的所有邻接结点都被搜索完。在扫描已发现结点u的邻接链表时,每当发现一个白色结点v,就将该结点v和边(u,v)同时加入转载 2016-08-19 14:29:10 · 518 阅读 · 0 评论 -
小白进阶之期望为线性时间的选择算法
期望为线性时间的选择算法,最坏时间复杂度为:θ(n²),期望时间复杂度为:θ(n)。选择算法用到了以前快速排序时用到的随机划分。目的是找出数组中第i个元素。算法的思想为:先随机划分,再看i的位置,若是i刚刚好等于随机划分的位置,则返回此位置的数组元素值,否则根据i的位置递归调用选择函数,寻找第i 个元素。与快速排序不同的是,此算法只要在一边递归调用函数就可以了,而快速排序需要两边都进行调用原创 2016-06-22 09:40:49 · 1563 阅读 · 0 评论 -
小白进阶之线性排序算法之计数排序、基数排序和桶排序
线性排序算法主要有三个:计数排序、基数排序和桶排序。计数排序:时间复杂度为O(n)。算法基本思路是:假设n个元素中的每个都是在0到k区间内的一个整数(其中k为某整数)。对于每个输入元素x,确定小于x的元素个数,利用这一信息,就可以直接把x放到它在输出数组中的位置了。基数排序:时间复杂度为θ(d(n+k))(其中d表示d位数,n表示共有n个d位数,k表示 每位数都在0到k-1区间内)。算原创 2016-06-22 07:47:40 · 420 阅读 · 0 评论 -
小白进阶之冒泡排序、归并排序、选择排序、冒泡排序
武汉一个阳光不算好不算坏的、丝毫没有夏意的夏日的周日写的四大排序算法。1.插入排序插入排序就像是给我们要排序的元素找一个合适的“坑”填进去一样。每一次都把元素与前面的元素比较,若是前面的元素比现在的元素大,则前面的元素下移,直到找到合适的“坑”。代码如下:void insertionSort(int a[],int n){ int i,j,key; for(j=1;j<10;j++原创 2016-05-29 22:04:33 · 381 阅读 · 0 评论 -
小白进阶之矩阵乘法
纠结犹豫了几天,终于还是下定决心写一下矩阵乘法。矩阵乘法有三种实现方法:暴力求解法、分治法、Strassen方法。暴力求解法就是用for循环,一个一个元素的算;分治法是把矩阵分为四块儿,再递归算;Strassen方法则是根据公式来计算。其实分治法和Strassen方法调用的函数是差不多的,但是Strassen方法的时间复杂度要小很多。下面就是源码了:multiply.h原创 2016-06-20 11:32:14 · 521 阅读 · 0 评论 -
小白进阶之快速排序
快速排序算法也用到了分治的思想。快速排序算法的平均性能很好,通常是实际排序应用中的最好的选择。分解:数组a[p..r]被划分成两个子数组(可能为空)a[p..q-1]和a[q+1..r],使得a[p..q-1]中的每一个元素都小于等于a[q],而a[q+1..r]中的每个元素也大于等于a[q]。解决:通过递归调用快速排序,对子数组a[p..q-1]和a[q+1..r]进行排序。合并:子原创 2016-06-19 14:29:17 · 314 阅读 · 0 评论 -
小白进阶之贪心算法VS动态规划
贪心算法和动态规划相同点:要求一个问题具有最优子结构的性质。不同点:动态规划每一步都要进行一次选择,但是选择依赖于子问题的解; 贪心算法进行选择时,直接作出在当前问题中看来最优的选择,而不考虑子问题的解。例如0-1背包问题就可以用动态规划解决而不能用贪心算法,但是分数背包问题就是用贪心算法解决而不是动态规划。关于0-1背包问题,有一个很好的博文可以分原创 2016-06-29 09:22:11 · 427 阅读 · 0 评论 -
小白进阶之优先队列排序
优先队列排序是堆的常见应用。优先队列和堆一样,有两种形式:最大优先队列和最小优先队列。此处是基于最大堆实现最大优先队列。最大优先队列的应用有很多,其中一个就是在共享计算机系统的作业调度。下面是代码:"priorityQueue.h"#include#include#includeint heapMaximun(int *a);//返回队列中的最大值int heapExt原创 2016-06-19 13:15:40 · 331 阅读 · 0 评论 -
小白进阶之堆排序
堆排序与归并排序一样,但不同于插入排序的是堆排序的时间复杂度为O(nlgn)。而与插入排序相同,但不同于归并排序的是堆排序同样具有空间原址性:任何时候都只需要常数个额外的元素空间存储临时数据。堆分为最大堆和最小堆。最大堆性质是指除了跟以外的所有结点i都满足:a[parent(i)]>=a[i];最小堆性质是指除了跟以外的所有结点都满足:a[parent(i)]此处堆排序使用的是最大堆。原创 2016-06-19 11:04:51 · 300 阅读 · 0 评论 -
小白进阶之随机排列数组
在《算法导论》的第五章讲的是概率分析和随机算法,于是产生了现在的随机排列数组问题。随机化有助于平衡输入分布,进而有利于分析一个算法的平均情况行为。特意去看了一下C语言里面产生随机数的函数(虽然是伪随机数)。两个基本函数为:int rand(void);void srand(unsigned int n);具体的可以参考如下:http://blog.sina.com.cn原创 2016-06-19 09:29:17 · 361 阅读 · 0 评论 -
小白进阶之寻找最大子数组问题
寻找最大子数组问题即为寻求数组中连续的最大子数组和。我尝试了三种求解办法:分治法、暴力求解法和动态规划。个人觉得分治法实现起来较为困难,而暴力求解法虽然时间复杂度较大,但是实现起来简单呐,然后动态规划实在是让人心旷神怡的解决办法,强烈推荐。暴力求解法:暴力求解法就是算出所有可能的子数组和,比较大小,得出最大子数组。下面时暴力求解法源码:int findMaxSubarray原创 2016-06-16 10:13:03 · 418 阅读 · 0 评论 -
小白进阶之贪心算法-赫夫曼编码
赫夫曼编码是根据字符的使用频率对字符进行编码的一种编码方法,其用于压缩数据的效果非常好。一般用二叉树表示赫夫曼编码,使用频率越低的字符,其深度越大。其中q表示一个按频率从小到大排序的优先队列。在赫夫曼编码的表示中,通常用前缀码的表达方法。前缀码即没有任何码字是其他码字的前缀,其作用是简化解码过程。用二叉树表示前缀码时,0表示转向左孩子,1表示转向右孩子。文件的最优编码方案总是对应一棵满二叉树。原创 2016-06-28 16:42:55 · 577 阅读 · 0 评论 -
小白进阶之动态规划-钢条切割
关于动态规划算法,首先是:什么样子的问题适合用动态规划算法来解呢?适合用动态规划算法解的问题应具有两个性质:最优子结构性质和具有重复子问题最优子结构性质是指:若一个问题的最优解包含其子问题的最优解,则此问题具有最优子结构性质。具有重复子问题性质是指:问题的递归算法会反复求解相同的子问题。然后是:动态规划算法的设计有四个步骤:1.刻画一个最优解的结构特征-寻找最优子结原创 2016-06-27 18:47:19 · 642 阅读 · 0 评论 -
小白进阶之动态规划-矩阵链乘法
问题描述:给定一个n个矩阵的序列(A1,A2,A3,...,An),希望计算它们的乘积的花销最小。用序列p= (p0,p1,p2,...,pn)表示矩阵序列的规模,m[i,j]表示计算矩阵Ai,j所需的标量乘法次数的最小值,s[i,j]记录最优值 m[i,j]对应的分割点k。下面是源码;matrixChain.h#include#include#includeint matr原创 2016-06-28 11:07:56 · 340 阅读 · 0 评论 -
小白进阶之动态规划-最优二叉搜索树
问题描述:给定关键词序列k=(k1,k2,...,kn)及其相应的概率pi,以及 n+1个伪关键字d0,d1,...,dn不在k值中。其中d0表示小于k1的值,dn表示大于kn的值,对于i=1,2,...,n-1,di表示在 ki和ki+1之间的值,用qi表示其搜索概率。用w(i,j)表示关键字ki,ki+1,...,kj的概率之和,e[i,j]表示包含关键字 ki,ki+1,...,kj原创 2016-06-28 11:03:10 · 548 阅读 · 0 评论 -
小白进阶之动态规划-最长公共子序列
问题描述:给定两个序列x=(x1,x2,...,xm)和y=(y1,y2,...,yn),z=(z1,z2,...,zx)为x 和y的任意最长公共子序列(LCS),c[i,j]表示xi和yj的LCS的长度,b[i,j]指向表项对应计算C[i,j]时所选的子问题的最优解。子问题分解如下:(1)若xm=yn,则zk=xm=yn且zk-1是xm-1和yn-1的一个LCS;(2)若xm!=原创 2016-06-28 10:58:45 · 310 阅读 · 0 评论 -
算法导论-最小生成树之kruskal算法和prim算法
1.Kruskal算法:集合A是一个森林,其结点为给定图的结点。每次加入集合A的安全边永远是权重最小的连接两个不同分量的边。、在最开始实现kruskal算法时,自己不知道如何实现集合A这个森林,也不知道怎么合并树。直到后来,自己去搜索了一下此算法的实现,才发现其实要用到之前自己一直觉得没啥用也不怎么理解的不相交集。下面是Kruskal算法的实现代码:KRUSKAL.htypedef转载 2016-08-21 15:43:19 · 470 阅读 · 0 评论