算法
麦兜NC粉
弱水三千偶只取一瓢饮
展开
-
拓扑排序实现(c++实现)
拓扑排序实现(c++)概要 拓扑排序是针对有向无回路图的。对有向无回路图G=(V,E)进行拓扑排序后,结果为该图所有顶点的一个先行序列,满足如果G包含有向边(u , v ),则在该序列中, u 就出现在 v 的前面(如果图存在回路,就不可能存在这样的线性序列)。 【算法导论】 有向无回路图用于说明事件发生的先后次序,比如完成某个工程就会存在一个次序关系,先要完成这个工作,然原创 2013-07-10 15:26:30 · 4893 阅读 · 0 评论 -
字符串匹配
字符串匹配参考资料:算法导论字符串匹配问题定义假设文本是一个长度为 n 的数组 T[ 1.. n ],模式是一个长度为 m 如果 0 字符串匹配算法比较算法预处理时间匹配时间朴素算法 0 O( (n-m+1) m )Rabin-K原创 2013-07-25 18:55:19 · 811 阅读 · 0 评论 -
字符串匹配 -- 朴素字符串匹配算法
朴素字符串匹配算法参考资料:算法导论朴素字符串匹配 它用一个循环来找出所有有效位移,该循环对 n - m + 1 个可能的每一个 s 值检查条件 P [ 1.. m ] = T [ s+ 1 .. s + m ] 。这种朴素的字符串匹配过程可以形象的看成用一个包含模式的模板沿文本滑动,同时对每一个位移注意木板上的字符是否与文本中的相应字符相等。 算法实现N原创 2013-07-26 11:29:51 · 2148 阅读 · 0 评论 -
字符串匹配算法 -- Rabin-Karp 算法
字符串匹配算法 -- Rabin-Karp 算法在实际应用中,Rabin-Karp 算法对字符串匹配问题能较好的运行。Rabin-Karp 算法需要对字符串和模式进行预处理,其预处理时间为 O ( m ) ,在最坏情况下的运行时间为 O ( ( n-m+1 ) m ) ,但基于某种假设(不知道是何种假设),它的平均情况下的运行时间还是比较好的。原创 2013-07-26 19:30:02 · 2014 阅读 · 0 评论 -
动态规划 -- 动态规划基础
什么时候需要用到动态规划呢?大致有两个要素:最优子结构和重叠子问题。1 最优子结构如果问题的一个最优解中包含了子问题的最优解,则该问题具有最优子结构。当一个问题具有最优子结构时,动态规划就可能适用(贪心算法可能也适用)。寻找最优子结构的时候,可遵循一种共同的模式1 问题的一个解可以是做一种选择。例如,选择一个前一个装配线装配站(有两原创 2013-07-23 11:00:36 · 1020 阅读 · 0 评论 -
字符串匹配 -- KMP算法
在前面的文章朴素字符串匹配、Rabin-Karp算法中,对有关字符串匹配问题做了相关的介绍。其中朴素字符串匹配效率较差,其时间复杂度为 O ( ( n - m + 1 ) m ) ,当问题规模较大时,该算法的劣势会变得更加明显;Rabin-Karp算法需要一个预处理,其时间为 O ( m ) ,匹配的最坏时间复杂度为 O ( ( n - m + 1 ) m ) ,但在平均情况和实际情况下,其效果还是不错的,所以应用还是很广的。 事实上还有一种字符串匹配算法 -- KMP算法 ( 有人将此算法戏称为看原创 2013-07-29 21:38:22 · 1225 阅读 · 0 评论 -
笔试题 -- 链表问题
笔试题 -- 链表问题1 判断俩个链表是否相交 给出俩个单向链表的头指针,比如h1,h2,判断这俩个链表是否相交。为了简化问题,我们假设俩个链表均不带环。 问题扩展: 1.如果链表可能有环列? 2.如果需要求出俩个链表相交的第一个节点列?两个链表相交 : 一种方法是把原创 2013-08-19 13:01:24 · 620 阅读 · 0 评论 -
动态规划 -- 最长公共子序列
动态规划之最长公共子序列参考资料1 算法导论2 v_JULY_v3 何海涛最长公共子序列(Longest Common Subsequence)简介给定两个序列 X 和 Y ,称序列 Z 是 X 和 Y 的公共子序列,如果 Z 即是 X 的一个子序列又是 Y 的一个子序列, 该公共子序列不要求是连续的,只是要求Z的元素在X和Y中是以相同的顺序出现。例如,如果 X =原创 2013-07-24 11:06:34 · 972 阅读 · 0 评论 -
程序员面试题精选100题(49)-复杂链表的复制[算法]
程序员面试题精选100题(49)-复杂链表的复制[算法] 题目:有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。其结点的C++定义如下: struct ComplexNode{ int m_nValue; ComplexNode* m_pNext转载 2013-08-28 10:01:59 · 567 阅读 · 0 评论 -
判断单链表是否存在环,判断两个链表是否相交问题详解
判断单链表是否存在环,判断两个链表是否相交问题详解 原文地址: http://www.cppblog.com/humanchao/archive/2008/04/17/47357.html有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环。问题:1、如何判断一个链表是不是这类链表?2、如果链转载 2013-08-28 16:49:38 · 581 阅读 · 0 评论 -
漫谈经典排序算法:一、从简单选择排序到堆排序的深度解析
漫谈经典排序算法:一、从简单选择排序到堆排序的深度解析author :touchlink : http://blog.csdn.net/touch_2011/article/details/67676731、序言这是《漫谈经典排序算法系列》第一篇,该篇从最简单的选择排序算法谈起,由浅入深的详细解析两种选择排序算法的过程及性能比较。逐步揭露选择排转载 2013-08-29 10:48:32 · 830 阅读 · 0 评论 -
动态规划
参考资料如下1 算法导论2 taesimple3 dc_7264 windmissing动态规划算法概述动态规划(dynamic programming)是通过组合子问题的解而解决整个问题的。事实上,分治算法与动态规划有部分相同之处也有不同之处。分治算法是将问题划分成一些独立的子问题,递归的求解各个子问题,然后合并得到原问题的解,它是采用自顶向下的方法以整体到局部的原创 2013-07-21 16:29:02 · 790 阅读 · 0 评论 -
动态规划 -- 最优二叉查找树
转自 :江南烟雨 一、什么是最优二叉查找树最优二叉查找树:给定n个互异的关键字组成的序列K=,且关键字有序(k1图一显示了给定上面的概率分布pi、qi,生成的两个二叉查找树的例子。图二就是在这种情况下一棵最优二叉查找树。概率分布:i012转载 2013-07-25 14:14:18 · 1347 阅读 · 0 评论 -
堆排序
( 二叉 ) 堆数据结构是一种数组对象,它可以被视为一颗完全二叉树。树中每个节点与数组中存放该节点值的那个元素对应。数的每一层都是填满的,最后一层可能除外。表示堆的数组A是一个具有两个属性的对象:length [ A ] 是数组中的元素个数,heap-size [A] 是存放在A 中的堆的元素个数。根据完全二叉树的性质,我们可以总结出如下性质:数的根为A [ 1 ] ,对于某个结点的下标 i ,其父节点为 Parent[i] = i/2 ,左孩子 Left[ i ] = 2*i ,右孩子 Right[ i原创 2013-07-30 13:13:09 · 1146 阅读 · 0 评论 -
深度优先遍历算法--非递归实现
深度优先遍历算法--非递归实现前言最近在看算法,拜读了CSDN大神的博文,深感大神就是犀利,只能膜拜了。同时为了与我的健忘症对斗争,有必要将学到的东西记下来。在图算法中,广度优先遍历算法和深度优先遍历算法是比较重要的算法,同时也是比较基础的搜索算法。算法思想 广度优先遍历算法( Breadth-First Search) :在给定图 G = ( V , E ) 和一个特定的源顶原创 2013-07-09 18:46:00 · 6277 阅读 · 0 评论 -
不相交集合 - 并查集
文章作者:姜南(Slyar) 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。恩,前两周学习了并查集,是时候总结一下了。等价关系与等价类从数学上看,等价类是一个对象(或成员)的集合,在此集合中的所有对象应满足等价关系。若用符号"≡"表示集合上的等价关系,那么对于该集合中的任意对象x,y, z,下列性质成立:1、自反性:x ≡ x转载 2013-07-13 09:17:42 · 1397 阅读 · 0 评论 -
最小生成树--Prim算法
算法介绍最小生成树主要有两种方法:Prim算法和Kruskal算法。这两种算法若采用二叉堆那么很容易达到 O(ElgV) 的运行时间。这两种算法都采用了贪心算法,在算法的每一步中,都试图选取最佳的结果,也就是总是选取权值最小的边或顶点。最小生成树Prim算法与Kruskal算法的找边不同,Prim算法是找点:即总是在找最小的顶点。该算法需要有个数组来保存权值,一个数组用来表原创 2013-07-13 14:53:23 · 686 阅读 · 0 评论 -
最小生成树--Kruskal算法
Kruskal算法Kruskal算法将无向图中的每一个点看做一个单独的集合(即一个连通图)。事先需要对所有权值进行排序,之后按由小到大的次序取权值。从第一个顶点开始找最小的边,并将第二个顶点设置为与第一个点连通,以此循环。其中该算法需要用到不相交集(并查集)来实现Kruskal算法。其中不相交集有三个主要的函数 Make-set(x) 建立一个新的集合,其唯一成员就原创 2013-07-13 15:41:57 · 787 阅读 · 0 评论 -
【转】随机算法全面总结
原文链接 : http://blog.csdn.net/ssjhust123/article/details/7917685随机算法涉及大量概率论知识,有时候难得去仔细看推导过程,当然能够完全了解推导的过程自然是有好处的,如果不了解推导过程,至少记住结论也是必要的。本文总结最常见的一些随机算法的题目,也当作面试的准备工作吧。需要说明的是,这里用到的随机函数都假定它能随机的产生范围[a,b]转载 2013-07-01 15:28:11 · 1019 阅读 · 0 评论 -
Floyd算法
Floyd算法用于解决每一对顶点之间的最短路径,其时间复杂度为 O(n3)。其基本思想:假设求从顶点Vi到Vj的最短路径。如果从Vi到Vj有弧,则从Vi到Vj存在一条长度为e[i][j]的路径,该路径不一定是最短的,需要进行n次的试探。首先考虑路径(Vi,V0,Vj)是否存在。如果存在,比较(Vi,Vj),小的保存下来。当下一次循环开始的时候又在加一个点,重复执行。其中该算法的核心部分原创 2013-07-17 09:50:30 · 726 阅读 · 0 评论 -
动态规划--装配线调度问题
总结归纳所学,给时间做个记号!!参考资料如下1 算法导论2 taesimple3 dc_7264 windmissing装配线调度问题该问题可参看算法导论动态规划部分章节或者google。所要解决的问题是确定应该在装配线1内选择那些站、在装配线2选择那些站,才能使得汽车通过工厂的总时间最小。动态规划之四部曲1 通过工厂最快路线的结构考虑从原创 2013-07-21 17:19:20 · 1170 阅读 · 0 评论 -
Huffman算法(最优二叉树)
该文只是一篇学习笔记罢了,只要是担心自己的记性,mark一下。PS:参考资料如下 1 严蔚敏吴伟民 -- 数据结构c语言版 2 Rachel-Zhang -- huffman编码——原理与实现 3 cscmaker-- 搬水果 (贪心算法实现)相关概念Huffman树又称最优二叉树,是一种带权路径长度最短的树。路径长度 从树中的一个节点原创 2013-07-20 15:45:03 · 5594 阅读 · 0 评论 -
动态规划 -- 矩阵链乘法
参考资料1 算法导论2 xiaowei_cqu3 ujs_abc矩阵链乘法简介对于给定的由n个要相乘的矩阵构成的序列 A1, A2, ..., An,要计算乘积 A1 A2 ... An 。根据矩阵的性质,可以在矩阵之间添加括号,最后的结果都是相同的。但是矩阵链中添加括号的顺序对求积运算的代价有很大的影响(可参考算法导论动态规划章节)。矩阵链乘法所要解决的问题是通过原创 2013-07-22 18:52:54 · 1346 阅读 · 0 评论 -
快速排序
快速排序是一种高效排序算法,对包含 n 个数的输入数组,最坏情况下运行时间为 O ( n2 ),虽然这个最坏情况运行时间比较差,但快速排序算法通常是用于排序的最佳的实用选择,因为其平均性能相当好:期望时间为 O ( n lg n) ,且 O ( n lg n) 记号中隐含的常数因子很小。快速排序采用了分治的思想。它的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。原创 2013-07-30 19:34:27 · 1108 阅读 · 0 评论 -
白话经典算法系列之五 归并排序的实现
author:MoreWindows link :http://blog.csdn.net/morewindows/article/details/6678165归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一转载 2013-08-29 15:40:51 · 651 阅读 · 0 评论