本章是克鲁斯卡尔算法的C++实现。目录1. 最小生成树2. 克鲁斯卡尔算法介绍3. 克鲁斯卡尔算法图解4. 克鲁斯卡尔算法分析5. 克鲁斯卡尔算法的代码说明6. 克鲁斯卡尔算法的源码转载请注明出处:http://www.cnblogs.com/skywang12345/更多内容:数据结构与算法系列 目录最小生成树在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树。
例如,对于如上...
最大期望算法(EM)K均值算法非常简单(可参见之前发布的博文),详细读者都可以轻松地理解它。但下面将要介绍的EM算法就要困难许多了,它与极大似然估计密切相关。1 算法原理不妨从一个例子开始我们的讨论,假设现在有100个人的身高数据,而且这100条数据是随机抽取的。一个常识性的看法是,男性身高满足一定的分布(例如正态分布),女性身高也满足一定的分布,但这两个分布的参数不同。我们现在不仅不知道男女身高分布的参数,甚...
一、SPF算法简介SJF算法SJF(shortest job first)是以进程的运行时间长度作为优先级,进程运行时间越短,优先级越高。SJF算法的缺点必须预知进程的运行时间。即使是程序员也很难准确估计进程运行时间。如果估计过低,系统就可能按估计的时间终止进程的运行,但此时进程并未完成,故一般都会偏长估计对长进程不利。长进程的周转时间会明显地增长。可怕的是,SJF算法完全忽视进程等待时间,可能使进程等待时间过长,出现饥饿现象。人机...
想必大家一定会Floyd了吧,Floyd只要暴力的三个for就可以出来,代码好背,也好理解,但缺点就是时间复杂度高是O(n3)。 于是今天就给大家带来一种时间复杂度是O(n2),的算法:Dijkstra(迪杰斯特拉)。 这个算法所求的是单源最短路,好比说你写好了Dijkstra的函数,那么只要输入点a的编号,就可算出图上每个点到这个点的距离。 我先上一组数据(这是无向图):56125138231243457252图大概是这个样子:我们以1为源点,来求所有点...
弗洛伊德算法介绍和Dijkstra算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。基本思想 通过Floyd计算图G=(V,E)中各个顶点的最短路径时,需要引入一个矩阵S,矩阵S中的元素a[i][j]表示顶点i(第i个顶点)到顶点j(第j个顶点)的距离。 假设图G中顶点个数为N,则需要对矩阵S进行N次更新。初...
1、全排列的非去重递归算法算法思路:全排列可以看做固定前i位,对第i+1位之后的再进行全排列,比如固定第一位,后面跟着n-1位的全排列。那么解决n-1位元素的全排列就能解决n位元素的全排列了,这样的设计很容易就能用递归实现。附代码段:void permutation1(char* str,int sbegin,int send) //全排列的非去重递归算法
{if( sbegin == send) //当 sbegin = send时输出{for(int i = 0;i <= send; i++) //输出一个排列cout << s...
摘要:Classification And Regression Tree(CART)是一种很重要的机器学习算法,既可以用于创建分类树(Classification Tree),也可以用于创建回归树(Regression Tree),本文介绍了CART用于离散标签分类决策和连续特征回归时的原理。决策树创建过程分析了信息混乱度度量Gini指数、连续和离散特征的特殊处理、连续和离散特征共存时函数的特殊处理和后剪枝;用于回归时则介绍了回归树和模型树的原理、适用场景和创建过程。个人认为...
BP算法是关于误差的反向传播算法,就是从输出层开始,将结果与预期结果相比较,求出误差,然后按照梯度最大下降方向,调整神经元的联接权值,然后依次逐层调整各层之间的连接权值,对于批量学习方式而言,不断重复上述过程,直到误差达到足够小时为止。对于输出层而言,我们可以直接使用在上一篇博文中关于感知器模型的算法,BP算法的难点在于,如何处理隐藏层,因为隐藏层没有正确的输出信息用来计算误差。下面我们将从输出层开始...
KMP算法主要用于解决包含问题,即存在两个字符串str1和str2,判断str1字符串中是否包含字符串str2,包含则返回str2对应在str1中的字符串的首字符的位置,否则返回-1;例如:str1="abc123def" str2="123d" ,str1的长度为N, str2的长度为M,则返回3; 那么如何解决这类问题呢?正常的解法所用时间复杂度为O(N*M),即一个一个字符进行匹配,匹配不成功,则str1索引向后移动一位,str2重新从首字符进行匹配。 使用KMP算法...
Tarjan算法详解 今天偶然发现了这个算法,看了好久,终于明白了一些表层的知识、、、、在这里和大家分享一下。。。 Tarjan算法是一个求解极大强联通子图的算法,相信这些东西大家都在网络上百度过了,这里不再赘述。 在这个算法中,定义了两个数组,一个是dfn数组,一个是low数组,相信大家在这里就晕了(我也晕了、、),不过自己模拟了几次算法执行过程之后,就理解了这个算法的意思,如果大家不明白,也可以这样做 ...
基本思想冒泡排序的基本思想是:
通过对待排序的序列从前向后依次比较相邻元素的值,如果发现逆序则交换。
逆序的含义:如果想把序列从小到大排序,那么两个数中前面的比后面的大就是逆序。
若需求是将序列从小到大排序,那么每一趟比较都会把值较大的逐渐从前面移动到后面。
就像水底的泡泡一样:
(如下图,图片来源于网络)例子给定一个数组如下:
[ 5 , 8 , -2 , 20 -6 ]
定义两个变量 i 和 j,初始状态 i 存第一个元素的索引,...
通过上一节的介绍,学习了串的普通模式匹配算法,大体思路是:模式串从主串的第一个字符开始匹配,每匹配失败,主串中记录匹配进度的指针 i 都要进行 i-j+1 的回退操作(这个过程称为“指针回溯”),同时模式串向后移动一个字符的位置。一次次的循环,直到匹配成功或者程序结束。"KMP"算法相比于"BF"算法,优势在于:
在保证指针 i 不回溯的前提下,当匹配失败时,让模式串向右移动最大的距离;并且可以在O(n+m)的时间数量级上完成...
生存还是死亡对象是否需要被垃圾收集器回收主要有两种方式:引用计数法和可达性分析算法引用计数法给对象添加一个引用计数器,每当有一个地方引用他的时候,计数器的数值就+1,当引用失效时,计数器就-1;任何时候计数器的数值都为0的对象时不可能再被使用的。
客观的来说,引用计数法实现简单,判定效率高,但是无法解决对象的循环引用的问题。所以现在的虚拟机很少使用这种算法辣判断对象是否存活。可达性分析算法基本思路就是:...
1 基本场景比如你有 N 个 cache 服务器(后面简称 cache ),那么如何将一个对象 object 映射到 N 个 cache 上呢,你很可能会采用类似下面的通用方法计算 object 的 hash 值,然后均匀的映射到到 N 个 cache ;hash(object)%N一切都运行正常,再考虑如下的两种情况;1 一个 cache 服务器 m down 掉了(在实际应用中必须要考虑这种情况),这样所有映射到 cache m 的对象都会失效,怎么办,需要把 cache m 从 cache 中移除,这时候 ...
一、DijkstraDijkstra单源最短路算法,即计算从起点出发到每个点的最短路。所以Dijkstra常常作为其他算法的预处理。 使用邻接矩阵的时间复杂度为O(n^2),用优先队列的复杂度为O(mlogn)(一) 过程每次选择一个未访问过的到已经访问过(标记为Known)的所有点的集合的最短边,并用这个点进行更新,过程如下:Dv为最短路,而Pv为前面的顶点。1. 初始V Known Dv PvV1 F 0 0V2 F ∞0V3 F ∞0V4 F ∞0V5 F ∞...