算法导论
掉下个小石头
jump jump jump...
展开
-
算法导论—二叉搜索树(BST)
华电北风吹 天津大学认知计算与应用重点实验室 日期:2015/9/9与散列表一样,搜索树数据结构也支持动态集合操作,包含插入,查询,删除,最小值,最大值,前驱,后继等。一、二叉搜索树: 二叉搜索树节点:关键字key,卫星数据,左孩子指针,右孩子指针,父节点指针,其他特殊类型(红黑树的节点颜色,AVL树的树高等)。 二叉搜索树性质:x是二叉搜索树中的任意一个节点。若y是x左子树中任意一个节点有原创 2015-09-09 11:14:47 · 1419 阅读 · 0 评论 -
算法导论—最长公共子序列
华电北风吹日期:2016/2/24问题描述: 给定两个序列X=(x1,x2,...,xm)X=(x_1,x_2,...,x_m)和Y=(y1,y2,...,yn)Y=(y_1,y_2,...,y_n),求XX和YY的长度最长的公共子序列。 子序列:给定一个序列X=(x1,x2,...,xm)X=(x_1,x_2,...,x_m),若另一个序列Z=(z1原创 2016-02-24 13:08:21 · 672 阅读 · 0 评论 -
算法导论—最长公共子串
华电北风吹日期:2016/2/22题目描述: 找两个字符串的最长公共子串是一个很简单的问题,注意这里的子串必须连续。解题思路: 例如对于字符串abcb和字符串cbc可以构建如下二维矩阵,匹配为1不匹配为0即可。这样直接看主对角线上连续1的最大长度即可。 c b c a 0 0 0 b 0 1 0 c 1 0 1原创 2016-02-22 21:22:50 · 764 阅读 · 0 评论 -
算法导论—最长递增子序列
华电北风吹日期:2016/2/20问题描述: 例如数组arr=[1,5,8,2,3,4]的最长递增子序列是1,2,3,4动态规划求解。对于数组中的每个元素,从前往后计算每个元素的状态——到这个元素为止所构成的最长递增子序列。时间复杂度Θ(n2)\Theta (n^2)。 参考代码:#include <iostream>#include <fstrea原创 2016-02-20 23:19:14 · 698 阅读 · 0 评论 -
算法导论—最短路径
华电北风吹日期:2016/1/16最短路径求法包含单源最短路径和所有节点对的最短路径。单源最短路径有Dijkstra算法和Bellman-Ford算法。所有节点对的最短路径求法有基于动态规划的矩阵乘法和Floyd-Warshall算法和针对稀疏图的Johnson算法。一、松弛操作 松弛操作是基于图中的有向边,通过边的起点对终点的最短路径长度上界进行压缩的原创 2016-01-16 13:24:17 · 954 阅读 · 0 评论 -
算法导论—基于DFS的图算法
华电北风吹日期:2016/1/14深度优先搜索在图论里面也有很多的应用 一、深度优先搜索 深度优先搜索,顾名思义,深,指的是对于当前结点,如果深度增加的时候可以访问到其他节点,那么就先访问深度增加的路线上的节点。 当然,以上只是深度优先搜索的最基本定义,真正使深度优先搜索得到广泛应用的是节点访问的开始时间和结束时间的定义。 在计算开始时间和结束时间原创 2016-01-14 11:08:36 · 1657 阅读 · 0 评论 -
算法导论—Trie树
华电北风吹 日期:2016-04-02Trie树,又名前缀树。Trie树的存储结构与B树类似。需要注意的一点是Trie树的节点不保存任何信息,所有的信息都保存在边上。Trie树比较简单,直接上代码吧。struct TrieNode{ int count; TrieNode* next[26]; bool exist; TrieNode() :count(0), e原创 2016-04-02 22:46:15 · 1221 阅读 · 0 评论 -
算法导论—最小生成树
华电北风吹日期:2016/1/16常用的最小生成树算法有Prime算法和Kruskal算法。Prime算法基于节点,Kruskal基于边。1、Prime算法 Prime算法属于贪心算法,与广度优先搜索类似。保持一个属于已发现的最小生成树节点的集合。每一次从未在树中的节点中选择一个与当前树中节点集合距离最近的节点,将这个边和节点加入到树中。 为了方便一般原创 2016-01-16 12:34:33 · 2222 阅读 · 0 评论 -
算法导论—Boyer-Moore(BM)算法
华电北风吹日期:2016/2/25BM算法精要: BM算法比KMP更高效。KMP是基于对匹配字符串挨个比较,而且对于某些前缀字符串对应的字符可能比较的次数要不止一次。BM的思路是构造坏字符规则和好后缀规则,每一次尽量多的过滤掉不用匹配的那些字符。参考资料: 字符串匹配的Boyer-Moore算法 BM算法详细图解参考代码: 本文写的这个BM实现比较原创 2016-02-26 17:35:45 · 1441 阅读 · 0 评论 -
算法导论—AC自动机
华电北风吹 日期:2016-05-03AC自动机是比较高效的多模式匹配算法。类似于KMP在模式串上的状态转移算法,AC自动机通过在trie树上建立状态转移,使得对匹配串遍历一遍就可以找到所有的模式串。 AC自动机一般有以下三步:首先,对所有的模式串建立trie树。然后,对trie树所有节点以它的最长后缀对应的前缀字符串作为它的失配指针,建立AC自动机。最后一步,对文本串在AC自动机上进行匹配。参原创 2016-05-03 10:53:42 · 1315 阅读 · 0 评论 -
算法导论—最大流(Edmonds-Karp算法)
华电北风吹 天津大学认知计算与应用重点实验室 2016-07-20有向图的最大流算法代码模板。利用广度优先搜索寻找残量网络增广路。参考代码:#include <iostream>#include <vector>#include <queue>using namespace std;#define maxn 10#define INT_MIN 0x80000000struct Edg原创 2016-07-20 16:55:55 · 1656 阅读 · 1 评论 -
算法导论—排序算法总结
声明:本文涉及的所有排序算法定义功能对输入进行从小到大排序 符号解释: n:输入数据个数Θ(n):n的同阶无穷大 一、选择排序def SelectSort(a): for i in range(0,len(a)-1): minIndex=i for j in range(i+1,len(a)): i原创 2015-06-15 10:43:52 · 10127 阅读 · 0 评论 -
算法导论—KMP
华电北风吹 日期:2016/2/24KMP精要: KMP在进行朴素匹配时,如果发现不匹配字符时,通过对已经匹配的那部分字符串的最大前缀来快速找到下一个模式串需要匹配的位置。KMP对模式进行预处理时间复杂度O(m),匹配时间复杂度O(n),总的KMP时间复杂度为O(m+n)。参考资料: 关于kmp原理讲解具体可以参考字符串匹配的KMP算法— 阮一峰参考代码:#include <iostream原创 2016-02-25 10:46:10 · 2003 阅读 · 0 评论 -
算法导论—最大子数组问题
华电北风吹 天津大学认知计算与应用重点实验室 日期:2015/6/30问题描述: 比如你获得了一个投资某个股票的机会,并且,你已经准确知道了将来几天这一只股票的相对于前一天的差值,比如为[13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7] (原始价格为[100,113,110,85,105,102,86,63,81,101,94,106,原创 2015-06-30 17:47:31 · 8640 阅读 · 4 评论 -
算法导论—二叉树非递归遍历
华电北风吹 天津大学计算机学院 日期:2016-08-22本文总结一下二叉树的非递归遍历基本数据结构参考代码struct ValueType{ int val;};struct Node{ ValueType val; Node* leftChild; Node* rightChild;};一、前序遍历vector<ValueType> PreOrder(原创 2016-08-22 21:43:18 · 480 阅读 · 0 评论 -
根据树遍历序列求解树结构
华电北风吹 日期:2015/9/8本文从二叉树的三种遍历方式中选择两种遍历方式,讨论怎么还原出二叉树的完整结构。树遍历基础知识: 1) 前序遍历:根节点+左子树+右子树 2) 中序遍历:左子树+根节点+右子树 3) 后序遍历:左子树+右子树+根节点一、已知前序遍历和中序遍历 已知一棵二叉树前序遍历和中序遍历分别为ABDEGCFH和DBGEACHF (h原创 2015-09-08 22:00:27 · 2770 阅读 · 0 评论 -
二分图最佳完美匹配
华电北风吹 天津大学认知计算与应用重点实验室 日期:2016-07-15一、二分图的几个相关定义: 最大匹配:匹配边最多。 完美匹配:所有的顶点全部是匹配点。 最佳完美匹配:边有权重,完美匹配中匹配边权值和最大。二、最佳完美匹配中需要了解的几个定义 顶标:给每个顶点赋一个数值,成为该顶点的定标。 可行顶标:如果对于所有的边,满足此边两端的两个顶点的定标和不小于此边权重,则称这一组顶标为原创 2016-07-15 14:13:43 · 2476 阅读 · 0 评论 -
算法导论—动态规划
华电北风吹 天津大学认知计算与应用重点实验室 日期:2015/8/27首先区分动态规划和分治策略。 这两者有很相似的地方,都是通过组合子问题的解来求解原问题。不同的是,分治策略将原问题划分为互不相交的子问题,递归的求解子问题,再将它们的解组合起来,求出原问题的解。与之相反,动态规划应用于子问题重叠的情况,即不同的子问题具有公共的子子问题(子问题的求解是递归进行的,将其划分为更小的子问题)。在这原创 2015-08-27 10:52:19 · 1837 阅读 · 0 评论 -
算法导论—最长回文子串和子序列
华电北风吹 2016/3/6回文串是指正序和逆序均相同的字符串。在回文子串的求解过程中,根据每个字符是否连续问题又可分为最长回文子串(绝对回文)和最长回文子序列(相对回文)。求解一个字符串中最长回文子串要求这个子串必须是连续的,而最长回文子序列则不要求这个子串是连续的,但是子串各个字符在原始串中的相对位置需要一致。例如对于字符串”character”,他的最长回文子串为”ara”,最长回文子序列则原创 2016-03-06 21:19:28 · 1717 阅读 · 0 评论 -
算法导论—散列表
华电北风吹 天津大学认知计算与应用重点实验室 日期:2015/9/8散列表(hash table)是一种支持高效插入,查询,删除操作的动态集合结构。并且在满足一些合理假设下,这些操作的平均时间复杂度可以达到Θ(1)\Theta(1) ,这也是散列表能够和二叉搜索树(红黑树)抗衡的一个重要方面。 一、直接寻址表 当关键字集合很小的时候,例如[1,2,…,m],直接寻址法的思路是分配一个长原创 2015-09-08 23:52:51 · 1222 阅读 · 0 评论 -
算法导论—中位数与顺序统计量
华电北风吹 天津大学认知计算与应用重点实验室 日期:2015/7/7一、选择最大值或者最小值的最优算法 对于长度为n的数组,已证找最大值或者最小值比较操作下界就是n-1。所以只需要让第一个值为初始最大值或者初始最小值,用所有的值与这个值比较,更新这个值即可。def minimum(a): minNum=a[0] for i in range(1,len(a)):原创 2015-07-07 23:17:29 · 13080 阅读 · 0 评论 -
算法导论—堆排序(python)
华电北风吹天津大学任职计算与应用重点实验室最后修改日期:2015/8/22堆排序算法先看第一个函数HeapAdjust,这个函数功能是在已经是构成堆的二叉树上,如果节点k数据变化了,对节点k进行修正,使之成为一个新的堆二叉树,n为数据长度。def HeapAdjust(lst,k,n): while(2*k+1<n): j=2*k+1原创 2015-04-05 19:36:29 · 3404 阅读 · 0 评论 -
算法导论—贪心算法
华电北风吹 天津大学认知计算与应用重点实验室 日期:2015/9/13一、贪心算法 顾名思义在每一步都做出”当前最优”的子决策,最后构成的策略就是最优策略。 例如知道一些工件的开始制造时间和结束制造时间,计算能够制造的最多的工件个数问题。在任意一个时间点,我只要寻找在当前时间点以后开工的并且最早结束的工件制造即可,然后跳至被选择工件结束时间,继续贪心选择。二、最优子结构 跟动态规划一样原创 2015-09-13 10:01:41 · 864 阅读 · 0 评论 -
算法导论—无向图的遍历(BFS+DFS,MATLAB)
华电北风吹 天津大学认知计算与应用重点实验室 最后修改日期:2015/8/22无向图的存储方式有邻接矩阵,邻接链表,稀疏矩阵等。无向图主要包含两方面内容,图的遍历和寻找联通分量。一、无向图的遍历 无向图的遍历有两种方式—广度优先搜索(BFS)和深度优先搜索(DFS)。广度优先搜索在遍历一个顶点的所有节点时,先把当前节点所有相邻节点遍历了,然后遍历当前节点第一个相邻的节点的所有相邻节点,广度优先原创 2015-08-22 13:44:49 · 14982 阅读 · 0 评论 -
算法导论—红黑树
华电北风吹 天津大学认知计算与应用重点实验室 日期:2015/9/9红黑树是对二叉树的一种平衡扩展(节点高度差不超过2倍)。红黑树采用开放的数据扩张策略,并且对于诸如插入、查询,删除有Θ(\Theta(lg n) n)的时间复杂度,因此也是一种应用比较广泛的数据结构。一、红黑树的节点 节点属性:关键字key,节点颜色,左孩子指针,右孩子指针,父节点指针,卫星数据。 虚拟节点—NIL:对于原创 2015-09-09 11:31:13 · 1084 阅读 · 0 评论 -
算法导论—二分图
华电北风吹 天津大学认知计算与应用重点实验室 日期:2015/9/13一、二分图定义 简单来说,如果图中顶点可以分为两组,使得所有边都跨越组的边界,则这就是一个二分图。准确地说:把一个图的顶点划分为两个不相交集 U 和V ,使得每一条边都分别连接U、V中的顶点。如果存在这样的划分,则此图为一个二分图。二分图的一个等价定义是:不含有含奇数条边的环的图。 二、二分图的判断 染色法+广度优先原创 2015-09-13 22:59:02 · 858 阅读 · 0 评论 -
算法导论—B树
华电北风吹 天津大学认知计算与应用重点实验室 最后修改日期:2015/9/10B树是二叉搜索树的扩展。B树主要是用于操作存储在磁盘或其他直接存取的辅助存储设备上的大量数据。当数据太多的时候,内存不足以支持全部的数据,因此需要分批将磁盘中的数据载入内存。由于对磁盘的读写操作相比于内存来说要慢几个数量级,所以在对磁盘数据进行读写的时候要尽量减少磁盘的读写次数。B树类似于红黑树,但在降低磁盘I/O原创 2015-09-09 11:34:04 · 1243 阅读 · 0 评论 -
算法导论—字符串匹配
华电北风吹 天津大学认知计算与应用重点实验室 最后修改日期:2016/1/4本文说说我对几个常用的字符串匹配算法的理解。 字符串匹配问题是指对于一个长度为n的文本数组T[n],检测长度为m的模式文本数组P[m]在T中出现的位置。常见的方法有朴素算法,Rabin-Karp算法,有限自动机算法,KMP(Knuth-Morris-Pratt)算法和Boyer-Moor(BM)算法。一、朴素算法原创 2016-01-04 13:03:18 · 1006 阅读 · 0 评论 -
算法导论—基于BFS的图算法
华电北风吹 天津大学认知计算与应用重点实验室 最后修改日期:2015/10/17这篇博客中的主要谈谈与广度优先搜索的相关算法。一、广度优先搜索 广度优先搜索,顾名思义,广,可以理解为宽,与深对应,当前深度有未遍历的节点就不做深入搜索。二、Dijklas求单源最短路径 给出起点,初始一个数据数组,记录该起点到所有节点的最短路径值(也可以用令一个数组记录最短路径),初始都为最大值。然后遍历该原创 2015-09-15 16:45:29 · 1350 阅读 · 0 评论 -
Floyd-Warshall算法python代码
华电北风吹 2017年3月12日未连接的边需要赋一个初始值,可以把矩阵所有元素值相加再加1。附加功能是计算最短路径的条数。import sysdef Floyd(Graph,ShortestPath,PathCount): NodeNum=len(Graph) lastShortestDistance=[[0 for i in range(NodeNum)] for j in ran原创 2017-03-12 22:05:22 · 2840 阅读 · 1 评论