
算法
文章平均质量分 94
csprimer
邮箱:aaron.yj@qq.com
展开
-
算法4第1章算法分析/抽象数据类型/链表/背包/栈/队列讲解
学习算法和数据结构可以帮忙我们编写更高效的程序,也可以帮忙我们在使用类库时选择合适的类和方法,带着这样的目的我们开始学习算法和数据结构。算法分析性能是算法研究的核心问题,也就是程序的运行时间,程序的运行时间主要和两点有关:1.每条语句的执行时间2.每条语句的执行频率前者取决于不同计算机的性能,后者取决于程序本身和输入例如我们分析下面这段程序的运行时间总时间T(N)=(...原创 2019-04-05 16:24:48 · 231 阅读 · 0 评论 -
算法4第5章低位优先/高位优先和三向快速字符串排序算法讲解
前面讲的插入/快速排序等通用排序算法对字符串排序同样有效,但对字符串排序有更加高效的排序算法。一种是低位优先的字符串排序算法(LSD),从右往左检查字符串的每个字符。一种是高位优先的字符串排序算法(MSD),从左往右检查字符串的每个字符。这两种算法都是基于一种叫做键索引计数法的排序方法实现的。低位优先的字符串排序首先看低位优先的字符串排序算法,LSD从字符串的右边开始,先按右边第1个...原创 2019-07-14 12:47:23 · 760 阅读 · 0 评论 -
算法4第4章加权有向图Dijkstra/BellmanFord最短路径算法关键路径算法讲解
最短路径即从一个顶点到达另一个顶点成本最小的路径,例如利用导航软件获取从一个地方到达另一个地方的路径,顶点对应路口,边对应公路,边的权重对应经过该路段的成本,可以是时间或距离,如果有单行线,那就要考虑加权有向图。加权有向图的数据结构实现如下public class EdgeWeightedDigraph { private static final String NEWLINE =...原创 2019-06-29 14:44:38 · 1159 阅读 · 0 评论 -
算法4第5章单词查找树和三向单词查找树讲解
单词查找树//跟排序一样,对字符串有更高效的查找算法可以实现以字符串作为key的符号表//这种符号表通过一种叫单词查找树的数据结构来实现,示意图如下://根节点无字母,每个节点都可能有0-R个子节点,某节点的值不为空则表示从根节点到该节点的字符构成的字符串key在符号表中有对应的value.//代码实现如下:public class TrieST<Value> {...原创 2019-07-23 19:00:33 · 413 阅读 · 0 评论 -
算法4第5章KMP/BoyerMoore/RabinKarp字符串查找算法讲解
暴力子字符串查找算法对于字符串txt和子字符串pat,判断txt中是否包含pat,如果有找出pat的位置。一般的思路是从txt的字符0-n与pat的字符0-m进行匹配,如果遇到不匹配的字符,再从txt的字符1-n与pat的字符0-m进行匹配,直到pat的字符都匹配了或txt的字符都遍历完了。代码如下:public static int search1(String pat, Strin...原创 2019-08-17 16:40:09 · 326 阅读 · 0 评论 -
算法4第5章正则表达式实现简介
正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。正则表达式描述了一种字符串匹配的模式(pattern),可以用来检查一个字符串是否含有满足该pattern的子串,正则表达式典型应用如下图:常见的*表示前面的符号重复0或多次,比如AB*表示的字符串由一个A和0个或多个B组成。|表示或操作,如A...原创 2019-08-17 16:41:21 · 385 阅读 · 0 评论 -
算法4第5章霍夫曼/LZW压缩算法讲解
双位编码压缩对于DNA编码ATAGATGCATAGCGCATAGCTAGATGTGCTAGC,如果按ACSII码来存储,需要8*35=280位,而DNA编码只有ACGT这4个字母,所以可以用两位00代表A,01代表C,10代表G,11代表T,只需要2*35=70位代码实现如下:public class Genome {// Do not instantiate.private ...原创 2019-08-17 16:42:17 · 655 阅读 · 0 评论 -
算法4第6章碰撞检测实现
碰撞检测采用事件驱动模型来模拟小球的运动及碰撞,首先预测所有的碰撞事件,按碰撞时间存入优先队列,碰撞发生时重新计算发生碰撞的小球的速度,方向,重新预测该小球可能发生的的碰撞事件存入优先队列同时定义一个重复的事件存入优先队列,用来模拟时钟及重绘每个小球的位置。遍历优先队列模型小球的运动和碰撞,示意图如下:public class CollisionSystem { pri...原创 2019-08-17 16:47:22 · 549 阅读 · 0 评论 -
算法4第6章后缀数组讲解
最长重复子字符串/后缀数组给定字符串怎样找到它的最长重复子字符串,如字符串atobeornottobe,最长重复子字符串是tobe使用一般的方法速度很慢,时间复杂度是O(N^2),而使用后缀数组可以巧妙而高效的解决此问题。首先找出字符的所有后缀字符串组成后缀字符串数组,对数组进行排序,然后遍历数组,最长重复子字符串就在相邻的两个后缀字符串中如字符串tobeornottobe,后缀...原创 2019-08-17 16:48:57 · 235 阅读 · 0 评论 -
算法4第6章 网络流算法/FordFulkerson算法/增广路径算法讲解
网络流算法问题描述:对应下图流量图的输油网络,只有一个入口和一个出口,每条管道都有相应的容量,中间每个节点的流入量和流出量要相同,怎样设计流量网络可以使出口的流量最大。流量图可以很自然的转换成有向图,每条边有容量限制和当前的流量,示意图如下:FordFulkerson算法也叫做增广路径算法可以解决最大流问题,该算法的思路是寻找一条从起点s到终点t的路径,该路径每条边的剩余流量不能...原创 2019-08-17 16:55:46 · 1745 阅读 · 0 评论 -
算法4第4章加权无向图/Prim/Kruskal算法计算最小生成树讲解
加权无向图加权图是为每条边关联一个权值的图模型,这种图可以自然的表示很多应用,在一副航班图中边表示航线,权值代表距离或价格,电路图中边表示电线,权值代表电线长度边的权重不一定是距离,也可能是时间,费用,也可能是0或负数加权无向图代码实现如下,只用把Graph实现里的Bag<Integer>换成Bag<Edge>,用Edge表示有权重的边public class Ed...原创 2019-06-29 12:54:36 · 954 阅读 · 0 评论 -
算法4第1章代码及习题讲解
求最大公约数计算两个非负整数p和q的最大公约数,若q是0,则最大公约数是p.否则将p处于q得到余数r,p和q的最大公约数即为q和r的最大公约数。public static int gcd(int p, int q) {if (q == 0) return p;int r = p % q;return gcd(q, r);}public static int gcd2(...原创 2019-04-13 16:40:05 · 336 阅读 · 0 评论 -
算法4第2章冒泡/选择/插入/希尔/归并排序及习题讲解
冒泡排序冒泡排序的操作流程如下:从0到N-1遍历一遍数组,a[0]与a[1]比较,如果a[0]比a[1]大,a[0]与a[1]交换位置,然后a[1]与a[2]比较,如果a[1]比a[2]大,a[1]与a[2]交换位置,直到a[N-1]最大。再从剩下的0到N-2遍历一遍数组,直到a[N-2]最大,再从剩下的0到N-3遍历一遍数组,直到a[N-3]最大,这样一直进行下去,从N-1到0就按降序排列...原创 2019-04-20 12:23:59 · 307 阅读 · 0 评论 -
算法4第2章快速排序/堆排序/优先队列及习题讲解
快速排序快速排序与归并排序类似,也是运用递归分治的思想,不过它不是从中间把数组a平分成2个子数组,而是选择一个切分元素a[lo]进行切分,切分过程中把比a[lo]小的元素都移到a[lo]的左边,把比a[lo]大的元素都移到a[lo]的右边,切分完成后根据a[lo]的最终位置j,把数组分成两个子数组a1和a2,这样a1的元素都<=a[j],a2的元素都>=a[j],再用同样的切分方...原创 2019-05-12 11:14:33 · 608 阅读 · 0 评论 -
算法4第3章二叉查找树及习题讲解
//符号表是一种存储键值对的数据结构, 它将一个键Key和一个值Value关联在一起存储,以后可以通过一个键值从符号表中找到其关联的值。//符号表一般用二叉查找树和哈希表实现,像java库里的HashMap/TreeMap//二叉查找树中每个节点都有一个Comparable的Key值和与Key关联的Value值,每个节点都有一个父节点(根节点除外),0/1/2个子节点,//每个节点的Key值...原创 2019-05-25 17:00:58 · 589 阅读 · 0 评论 -
算法4第3章红黑树及习题讲解
二叉查找树在最坏的情况下性能很差时间复杂度是O(N),本节我们学习一种新的数据结构红黑树它能保证操作在最坏情况下时间复杂度也是O(logN),无论怎么构造,它都能到达平衡,红黑树结构很复杂,首先我们学习一种叫2-3树的数据结构来帮忙对红黑树的理解。一般的二叉查找树一个节点只能有一个键两个子节点,在2-3树中一个节点最多可以有两个键3个子节点,左子树中的键都比左边的键小,中间子树的键大于左边的...原创 2019-05-25 18:24:25 · 2274 阅读 · 1 评论 -
算法4第3章哈希表及习题讲解
红黑树实现过于复杂,当不需要符号表中的键值有序时可以使用哈希表来实现符号表哈希表同红黑树一样高效,但是实现简单哈希表使用数组存储键值对,通过一个hash函数把key转成数组的索引,然后把value存储在数组中该索引的位置如果不同的key通过hash函数转换的索引i相同,则把i位置的不同key-value值通过链表链接起来查找的时候先通过hash找到索引位置,再遍历链表找到与key相同的ke...原创 2019-05-25 21:09:58 · 831 阅读 · 0 评论 -
算法4第3章符号表的应用索引和稀疏矩阵
前面讲的符号表都是一个键对应一个值或多个键对应一个值,生活中还有很多应用需要一个键对应多个值,比如一个电影对应多个演员,这种结构被称为索引下面的代码利用符号表实现索引和反向索引,可以把一个电影和多个演员关联,并且可以反过来把一个演员和多部电影关联起来/************************************************************************...原创 2019-05-28 13:15:34 · 249 阅读 · 0 评论 -
算法4第4章图/无向图/深度优先搜索/广度优先搜索讲解
考虑下面的一些问题:1.迷宫问题,找到从入口到出口的一条路径2.两座城市间有很多不同的路口连接,导航怎么找到两座城市之间的最短路径3.把不同地方的许多计算机通过网线连接起来,怎么布线最节省网线这些问题都可以通过图来描述和解决,图由一组顶点和一组将两个顶点相连的边组成,图可以分为无向图,有向图,加权图,加权有向图,我们先研究无向图。无向图的表示无向图中的边仅仅是两个顶点间的连...原创 2019-06-10 15:51:03 · 381 阅读 · 0 评论 -
算法4第4章无向图/拓扑排序讲解
//有向图由一组顶点和一组有方向的边组成,每条有方向的边连接着一对有序顶点示意图如下//在一副有向图中,一个顶点的出度为该顶点指出的边的总数,入度为指向该顶点边的总数//有向边的实现和无向边类似,只是在添加边时是有方向的,代码实现如下import java.util.NoSuchElementException;import StdLib.In;import StdLib.StdO...原创 2019-06-16 15:51:52 · 3204 阅读 · 0 评论 -
算法4第6章 B+树讲解
B+数树是一种多叉平衡查找树,由于B+树对磁盘进行IO操作更加合理高效,所以许多数据库系统都使用这种数据结构来实现索引.多叉是相对二叉树而言,平衡是指从根节点到所有叶子节点的路径长度是一样的,查找是指一个非叶子节点所有左边节点的值都比右边节点的值要小。B+树还有以下主要特性:1.假设每个节点可以存M个关键字,则每个节点最多有M+1个子节点.2.关键字对应的信息只存在叶子节点,非叶子节点只...原创 2019-08-17 16:58:32 · 314 阅读 · 0 评论