查找算法

KMP算法实现查找字符串第一次出现的位置

一世执手 提交于 2020-01-27 01:18:23
package ten_algorithm . kmp ; import ten_algorithm . dynamic . KnapSack ; import java . util . Arrays ; /** * Author:jinpma * Date :2019/12/28 */ public class KmpSearch { public static void main ( String [ ] args ) { String str1 = "BBC ABCDAB ABCDABCDABDE" ; String str2 = "ABCDABD" ; KmpSearch k = new KmpSearch ( ) ; int [ ] next = k . next ( str2 ) ; int index = k . findIndex ( str1 , str2 , next ) ; System . out . println ( index ) ; } private int findIndex ( String str1 , String str2 , int [ ] next ) { int i , j ; for ( i = 0 , j = 0 ; i < str1 . length ( ) ; i ++ ) { if ( str1 . charAt ( i

015查找有向图中的强连通分量

醉酒当歌 提交于 2020-01-26 22:52:02
查找有向图中的强连通分量 图学习笔记索引 本文参考《算法(第4版)》 1.实现代码 2.总结 图学习笔记索引 001自定义输入流In类实现 002背包数据类型Bag实现 003无向图数据类型实现 004基于图的深度优先搜索 005使用深度优先搜索找图中的所有连通分量 005-1基于深度优先搜索查找图中连通路径 006基于深度优先搜索判断图中是否存在环 007基于深度优先搜索判断一个无向图图是否是一个二分图 008广度优先搜索查找连通图中的最短路径 009有向图数据类型实现 010有向图的可达性 011带权重的无向边数据类型Edge实现 012加权无向图数据类型实现 013寻找有向环 014有向图中基于深度优先搜索的顶点排序 本文参考《算法(第4版)》 1.实现代码 点击文字获取:001自定义输入流In类实现 从文件中读取图的顶点关系。 tinyDG.txt中的内容: 13 22 4 2 2 3 3 2 6 0 0 1 2 0 11 12 12 9 9 10 9 11 8 9 10 12 11 4 4 3 3 5 7 8 8 7 5 4 0 5 6 4 6 9 7 6 Java代码: package algorithms.graph; import java.io.IOException; public class KosarajuSCC { private boolean

二维数组的查找(编程题目)

喜你入骨 提交于 2020-01-26 21:22:07
二维数组的查找 题目分析 暴力求解 O ( n l g n ) O(nlgn) O ( n l g n ) python代码如下: 技巧法 O ( n ) O(n) O ( n ) python代码如下 二维二分查找法 O ( l g n ) O(lgn) O ( l g n ) python代码如下 题目描述:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 题目分析   任何一道算法题,在拿到题目之后,都是首先从基础的题干入手,了不起我看不懂任何题干中的隐藏信息,我直接暴力求解,起码让自己有一定的思路,先能解决问题,对于笔试题目的编程,有可能由于测试用例的量级比较小,直接求解了。而且对于一般的问题(排除很明显的动态规划、或者贪心算法暗示,这种题目暴力法很可能达到指数复杂度)。最最最传统的暴力法没有意义,不做讲解,首先抓住题干中的行(列)内有序,大不了这个有序就可以使用二分查找,同时也要认清楚线性有序,有序基本上必然和二分查找分不开了。 暴力求解 O ( n l g n ) O(nlgn) O ( n l g n )   首先来讲解暴力求解,如上分析,这个暴力求解不是指 O ( n 2 ) O(n^2) O ( n 2 )

动画 | 什么是2-3树?

梦想与她 提交于 2020-01-26 17:52:17
我们回忆一下AVL树,它在插入和删除节点时,总要保证任意节点左右子树的高度差不超过1。正是因为有这样的限制,插入一个节点和删除一个节点都有可能调整多个节点的不平衡状态。频繁的左旋转和右旋转操作一定会影响整个AVL树的性能,除非是平衡与不平衡变化很少的情况下,否则AVL树所带来的搜索性能提升不足以弥补平衡树所带来的性能损耗。 那有没有绝对平衡的一种树呢?没有高度差也不会有平衡因子,没有平衡因子就不会调整旋转操作。2-3树正是一种绝对平衡的树,任意节点到它所有的叶子节点的深度都是相等的。 2-3树的数字代表一个节点有2到3个子树。它也满足二分搜索树的基本性质,但它不属于二分搜索树。 2-3树定义 一颗2-3树或为一颗空树,或有以下节点组成: 2-节点,含有一个元素和两个子树(左右子树),左子树所有元素的值均小于它父节点,右子树所有元素的值均大于它父节点; 3-节点,还有两个元素和三个子树(左中右子树),左子树所有元素的值均小于它父节点,中子树所有元素的值都位于父节点两个元素之间,右子树所有元素的值均大于它父节点; 子树也是空树、2-节点或者3-节点; 没有元素相等的节点。 2-3树查找元素 2-3树的查找类似二分搜索树的查找,根据元素的大小来决定查找的方向。要判断一个元素是否存在,我们先将待查找元素和根节点比较,如果它和其中任意一个相等,那查找命中;否则根据比较的结果来选择查找的方向。

动画 | 什么是2-3-4树?

感情迁移 提交于 2020-01-26 15:34:27
画了一系列树的动画,从二分搜索树,到AVL树,再到2-3树,再到基于2-3树的红黑树,都可以发现这些树都跟二叉查找树很像啊。 嘿嘿!二分搜索树就是二叉查找树;AVL树也是一颗二分搜索树,只多了高度差的限制;2-3树虽满足二分搜索树的性质,但不是一颗二分搜索树,2-3树由2-节点和3-节点组成的,满足了完美平衡性;基于2-3树的红黑树就是希望不要有3-节点,将3-节点转换成二叉,两个元素之间由红链接相连,并约定谁是子节点谁是红的,如下图。 本篇文章还会继续介绍满足二分搜索树性质的一棵树,它是2-3-4树,和2-3树一样也不是一颗二分搜索树。它在2-3树的基础上可以存储4-节点,4-节点由三个元素组成,有四个子树。 查找元素 和二分搜索树一样,根据元素的大小来决定查找的方向。要判断一个元素是否存在,我们首先将待查找元素和根节点逐一比较,如果它和当前节点中的一个元素相等,就返回查找命中;如果它比当前节点任一元素要大,就选择右递归进行下一个节点;如果它比当前节点任一元素要小,就选择左递归进行下一个节点;直到树底下的空节点,返回查找未命中。 插入元素 我们知道2-3树树底下最多是3-节点,可以直接插入元素然后再判断是否是4-节点,如果是向2-节点插入一个元素,变成3-节点无需分解;如果是向3-节点插入一个元素变成4-节点,进行向上变换将中间的键合并到父节点,如果父节点也变成4-节点

动画 | 什么是2-3树?

╄→尐↘猪︶ㄣ 提交于 2020-01-26 15:29:11
我们回忆一下AVL树,它在插入和删除节点时,总要保证任意节点左右子树的高度差不超过1。正是因为有这样的限制,插入一个节点和删除一个节点都有可能调整多个节点的不平衡状态。频繁的左旋转和右旋转操作一定会影响整个AVL树的性能,除非是平衡与不平衡变化很少的情况下,否则AVL树所带来的搜索性能提升不足以弥补平衡树所带来的性能损耗。 那有没有绝对平衡的一种树呢?没有高度差也不会有平衡因子,没有平衡因子就不会调整旋转操作。2-3树正是一种绝对平衡的树,任意节点到它所有的叶子节点的深度都是相等的。 2-3树的数字代表一个节点有2到3个子树。它也满足二分搜索树的基本性质,但它不属于二分搜索树。 2-3树定义 一颗2-3树或为一颗空树,或有以下节点组成: 2-节点,含有一个元素和两个子树(左右子树),左子树所有元素的值均小于它父节点,右子树所有元素的值均大于它父节点; 3-节点,还有两个元素和三个子树(左中右子树),左子树所有元素的值均小于它父节点,中子树所有元素的值都位于父节点两个元素之间,右子树所有元素的值均大于它父节点; 子树也是空树、2-节点或者3-节点; 没有元素相等的节点。 2-3树查找元素 2-3树的查找类似二分搜索树的查找,根据元素的大小来决定查找的方向。要判断一个元素是否存在,我们先将待查找元素和根节点比较,如果它和其中任意一个相等,那查找命中;否则根据比较的结果来选择查找的方向。

动画 | 什么是红黑树?(与2-3树等价)

自古美人都是妖i 提交于 2020-01-26 15:09:34
学习过2-3树之后就知道应怎样去理解红黑树了,如果直接看「算法导论」里的红黑树的性质,是看不出所以然。我们也看看一颗二分搜索树满足红黑的性质: 1.每个节点或是红色的,或是黑色的; 2.根节点是黑色的; 3.每个叶子节点(NIL)是黑色的; 4.如果一个节点是红色的,则它的两个子节点都是黑色的; 5.对每个节点,从该节点到其所有后代叶子节点的简单路径上,均包含相同数目的黑色节点。 如果说前面4个还算理解,那第5个性质又是怎么去理解呢?此时我们借着2-3树去理解基本的红黑树,当然我会在后几篇文章介绍2-3-4树以及基于2-3-4树的红黑树。 抛开上面二分搜索树满足红黑的性质,我们知道2-3树不是二叉树,我们把它转换成一颗二叉树,2-节点很好转,3-节点转二叉却有两种,如下图: 红黑是指被指向节点的链接颜色,对于一颗2-3树,因为3-节点的存在有很多不同的二叉树的表示,所以我们只考虑左倾的情况。 左倾红黑树和2-3树等价的定义 红黑树的定义是含有红黑链接并满足下列条件的二分搜索树: 1.红链接均为左连接; 2.没有任何一个节点同时和两条红链接相连; 3.该树是完美黑色平衡的,即任意空链接到根节点的路径上的黑链接数量相同(和2-3树等价的,任意节点到其叶子节点的高度都是相同的)。 因为2-3树不存在永久的4-节点,4-节点终归要分解的(在2-3-4树中,为了更好地插入和删除,4

《算法》笔记 14 - 单词查找树

邮差的信 提交于 2020-01-26 08:36:05
R向单词查找树 数据结构 查找 插入 查找所有键 通配符匹配 最长前缀 删除 R向单词查找树的性质 三向单词查找树 三向单词查找树的性质 同字符串的排序一样,利用字符串的性质开发的查找算法也比通用的算法更有效,这些算法可以用于在以字符串作为被查找键的场合。这类算法在面对巨量的数据时,仍然可以取得这样的性能:查找命中所需的时间与被查找的键的长度成正比;而查找未命中时只需检查若干个字符。这样的性能是相当惊人的,也是算法研究的最高成就之一,这些算法成了建成现在能够便捷、快速地访问海量信息所依赖的基础设施的重要因素。 R向单词查找树 数据结构 单词查找树(Trie)是用于字符串键查找的数据结构。与之前的查找树类似,它也是由链接的结点所组成的数据结构,这些链接可能为空,也可能指向其他结点。 结点的数据结构为: private static class Node { private Object val; private Node[] next = new Node[R]; } 每个节点都只有一个或0个指向它的结点(父结点),只有根结点不会有父结点。每个节点都含有R条链接,R为字母表的大小,如果字符都由26个小写英文字母构成,则R为26;如果字符属于ASCII字符集,则R=128;DNA研究中用4个字母表示4个碱基,R=4。 R条链接对应可能出现的字符,这其中会有大量的空链接

百度谷歌离线地图解决方案(离线地图下载)

心不动则不痛 提交于 2020-01-26 07:27:02
一 地图的加载与显示 关于GMap的介绍与使用可以看我以前的文章: GMap.Net开发之在WinForm和WPF中使用GMap.Net地图插件 GMap.Net是.Net下一个地图控件,可以基于Http协议加载各个公司的地图,如Google,Bing,ArcGIS的,主要原理是通过解析各个公司的地图服务的URL,传入相应的参数得到对应的切片底图(Tiled map),如一个高德地图的GMapProvider的实现如下: using System; using GMap.NET; using GMap.NET.MapProviders; using GMap.NET.Projections; namespace GMapProvidersExt { public abstract class AMapProviderBase : GMapProvider { public AMapProviderBase() { MaxZoom = null; RefererUrl = "http://www.amap.com/"; //Copyright = string.Format("©{0} 高德 Corporation, ©{0} NAVTEQ, ©{0} Image courtesy of NASA", DateTime.Today.Year); } public override

MySQL中的索引

五迷三道 提交于 2020-01-25 21:52:06
索引是一个比较复杂的模块,要学好需要多花点时间。索引是MySQL进行查询优化的一个很重要的手段,如果用得好,可以成为数据访问的有力而且灵活的工具,快速提高查询效率,所以多花点时间好好学习和思考这一块内容也是很值得的。下面,对MySQL中索引的内容做了一下归纳总结,有点零散。 01、索引基础 1、索引是存储引擎用于快速找到记录的一种数据结构。 2、索引是对查询性能优化最有效的手段。 3、B-树索引能够加快访问数据的速度,因为存储引擎不再需要进行全表扫描来获取需要的数据,取而代之的是索引的根节点开始进行搜索。根节点的槽中存放了指向子节点的指针,存储引擎根据这些指针向下层查找。通过比较节点页的值和要查找的值可以找到合适的指针进入下一层子节点,这些指针实际上定义了子节点页中值的上限和下限。最终存储引擎要么是找到对应的值,要么该记录不存在。 4、B-树对索引列是顺序组织存储的,所以很适合查找范围数据。 5、使用B-树索引适用于全键值、键值范围或键前缀查找。具体地: (1)全值匹配 (2)匹配最左前缀 (3)匹配列前缀 (4)匹配范围值 (5)精确匹配某一列并范围匹配另一列 (6)只访问索引的查询 6、如果不是按照索引的最左列开始查找,则无法使用索引。 7、不能跳过索引中的列。 8、如果查询中有某个列的范围查找,则其右边所有列都无法使用索引优化查找。 9、哈希索引:对于每一行数据