数据结构与算法
介绍数据结构与算法的基本内容以及用法。
一个小宝
程序猿的每一天~~~
展开
-
2020-09-07
**克鲁斯卡尔算法**克鲁斯卡尔算法是求连通网的最小生成树的另一种方法。与普里姆算法不同,它的时间复杂度为O(eloge)(e为网中的边数),所以,适合于求边稀疏的网的最小生成树 。克鲁斯卡尔(Kruskal)算法从另一途径求网的最小生成树。其基本思想是:假设连通网G=(V,E),令最小生成树的初始状态为只有n个顶点而无边的非连通图T=(V,{}),图中每个顶点自成一个连通分量。在E中选择代价最小的边,若该边依附的顶点分别在T中不同的连通分量上,则将此边加入到T中;否则,舍去此边而选择下一条代价最小原创 2020-09-07 16:06:48 · 83 阅读 · 0 评论 -
2020-09-07
普里姆算法普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(Vertex (graph theory)),且其所有边的权值之和亦为最小。基本介绍:1).输入:一个加权连通图,其中顶点集合为V,边集合为E;2).初始化:Vnew = {x},其中x为集合V中的任一节点(起始点),Enew = {},为空;3).重复下列操作,直到Vnew = V:a.在集合E中选取权值最小的边<u, v>,原创 2020-09-07 13:51:29 · 127 阅读 · 0 评论 -
2020-09-06
KMP算法KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)***由于暴力匹配算法太消耗资源时间,所有我们一般采取KMP算法来解决匹配字符串。实现代码:package com.a原创 2020-09-06 16:40:53 · 97 阅读 · 0 评论 -
2020-09-06
**Java实现汉诺塔问题**汉诺塔问题,是心理学实验研究常用的任务之一。该问题的主要材料包括三根高度相同的柱子和一些大小及颜色不同的圆盘,三根柱子分别为起始柱A、辅助柱B及目标柱C。对于这样一个问题,任何人都不可能直接写出移动盘子的每一步,但我们可以利用下面的方法来解决。设移动盘子数为n,为了将这n个盘子从A杆移动到C杆,可以做以下三步:(1)以C盘为中介,从A杆将1至n-1号盘移至B杆;(2)将A杆中剩下的第n号盘移至C杆;(3)以A杆为中介;从B杆将1至n-1号盘移至C杆。汉诺塔处理原创 2020-09-06 00:17:40 · 83 阅读 · 0 评论 -
2020-09-05
B树、B+树、B*树的介绍虽然二叉树的操作效率高,但是也存在一些问题,二叉树是需要加载到内存中处理的,当二叉树的结点很多的时候:(1)就会存在多次进行i/o操作,在构成二叉树时,对速度有非常大的影响和消耗。(2)会造成二叉树的高度变得很大,降级操作速度所以我们需要用到B树,B树通过重新组织结点,降低树的高度,减少i/o的读写操作来提升效率。将二叉树转换为B树(1)将二叉树重新组织结点,降低了高度(2)将一个结点的大小设为等于一个页(页大小为4K),此时每个结点只需要一次i/o就可以完全载入(原创 2020-09-05 15:31:55 · 772 阅读 · 0 评论 -
2020-09-05
平衡二叉树平衡树(Balance Tree,BT) 指的是,任意节点的子树的高度差都小于等于1。常见的符合平衡树的有,B树(多路平衡搜索树)、AVL树(二叉平衡搜索树)等。平衡树可以完成集合的一系列操作, 时间复杂度和空间复杂度相对于“2-3树”要低,在完成集合的一系列操作中始终保持平衡,为大型数据库的组织、索引提供了一条新的途径。平衡二叉树的实现方法:左旋转:满足条件:如果它的右子树的左子树的高度大于它的右子树高度,先对这个结点的右子结点进行右旋转(1)创建一个新的结点newNode,值等于原创 2020-09-05 00:52:51 · 184 阅读 · 0 评论 -
2020-09-04
二叉排序树二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。是数据结构中的一类。在一般情况下,查询效率比链表结构要高。一棵空树,或者是具有下列性质的二叉树:(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;(3)左、右子树也分别为二叉排序树;(4)没有键值相等的结点。二叉排序树的删除(有以下三种情况):情况一:删除叶子结点(1)找到需要删除原创 2020-09-04 12:38:06 · 114 阅读 · 0 评论 -
2020-09-04
Java实现堆排序堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序是一种选择排序,他的最好、最坏,平均时间复杂度均为O(nlogn),它也是不稳定的排序。堆是具有以下性质的完全二叉树:(1)每个结点的值都大于或等于其左右子结点的值,称为大顶堆(2)每个结点的值都小于或等于其左右子结点的值,称为小顶堆(3)升序使用大顶堆,降序使用小顶堆堆排序的思路:(1)将需要原创 2020-09-04 00:29:26 · 158 阅读 · 0 评论 -
2020-09-03
中序线索化二叉树(JAVA实现):*由于二叉树没有有效地利用左右指针,从而可以使用线索二叉树。*线索化二叉树特点:(1)一个结点的前一个结点,称为前驱结点(2)一个结点的后一个结点,成为后继结点(3)n个结点的二叉链表中含有n+1(2n -(n-1) = n+1)个空指针域。利用二叉链表中的空指针域,存放指向该结点在某种遍历次序下的前驱和后继结点的指针,这个指针成为“线索”。(4)这种加上线索的二叉链表成为线索链表,相应的二叉树称为线索二叉树。根据线索性质的不同,线索二叉树可分为前序、中序、原创 2020-09-03 21:46:45 · 137 阅读 · 0 评论 -
2020-09-01
顺序存储二叉树从数据结构来看,数组存储方式与树的存储方式可以相互转换,也就是说数组可以转换为树,树也可以转换为数组。顺序存储二叉树的思路:(1)顺序存储二叉树通常情况下只考虑完全二叉树(2)第n个元素的左子结点为:2 * n + 1(3)第n个元素的右子结点为:2 * n + 1(4)第n个元素的父结点为:(n - 1) / 2(5)n:表示二叉树的第几个元素顺序存储二叉树遍历实现代码:package com.struct;public class ArrBinaryTreeDemo原创 2020-09-01 10:31:32 · 101 阅读 · 0 评论 -
2020-08-30
二叉树:树有很多种,每个节点最多只能有两个子节点的一种形式称为二叉树,二叉树的子节点分为左节点与右节点。如果该二叉树所有的叶子节点都在最后一层,并且满足结点的总数 = 2^n - 1(n为树的层数),则称为满二叉树。 如果二叉树的所有叶子节点(没有子节点的节点)都在最后一层或者倒数第二层,而且最后一层的叶子节点在左边连续,倒数第二层的叶子节点在右边连续,则称为完全二叉树。前序遍历:先输出父节点,再遍历左子树和右子树。(1)先输出当前节点(初始的节点为root)(2)如果左子节点不为空原创 2020-08-30 17:51:00 · 537 阅读 · 0 评论 -
2020-08-30
哈希表:散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。实现方式有:数组+链表(每次放入数据时都要哈希一下,提高速率) 数组+二叉树哈希表可以作为中间缓存,把一些暂且不须放在数据库的数据放在中间缓存区上进行对应的处理。实现方式:package com.java;import javax.sw原创 2020-08-30 16:39:17 · 97 阅读 · 0 评论 -
2020-08-27
斐波那契查找法(黄金分割法):黄金分割点是指把一条线段分割为两部分,使其中一部分与全长之比等于另一部分与这部分之比。其比值是一个无理数,用分数表示为(√5-1)/2,取其前三位数字的近似值是0.618。斐波那契查找法与二分查找法、插值查找法相似,只是mid不再取中间值,而是取黄金分割点附近,即mid = low + F[k-1] -1。F代表着斐波那契数列。***斐波那契实现原理:其实该查找法就是借助斐波拉契数列,首先判断自身数组长度是否与斐波那契数列里面其中的值相等,如果不相等,就一直查找到斐波那原创 2020-08-27 11:57:17 · 122 阅读 · 0 评论 -
2020-08-26
插值查找算法插值查找,有序表的一种查找方式。插值查找是根据查找关键字与查找表中最大最小记录关键字比较后的查找方法。插值查找基于二分查找,将查找点的选择改进为自适应选择,提高查找效率。插值查找原理:(1)插值查找类似于二分查找,不同的是自适应的mid的值不一样。(2)二分查找的mid = (left + right) / 2插值查找的 mid = left + (right-left)*(findVal - arr[left])/(arr[right]-arr[left])(3)插值查法对于数据原创 2020-08-26 14:29:04 · 92 阅读 · 0 评论 -
2020-08-26
二分查找法(折半查找法)二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。二分查找法思路:(1)首先保证查找的数组是有序的。(2)确定数组的中间下标:mid = (left + right) /2;(3)比较需要查找的值与arr[mid] 如果findVal < arr[mid],继续向左递归查找 如果findVal > arr[mid],继续向右递归查找 如果findV原创 2020-08-26 12:47:30 · 110 阅读 · 0 评论 -
2020-08-26
递归算法(基于JAVA实现)递归算法,在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。递归式方法可以被用于解决很多的计算机科学问题,因此它是计算机科学中十分重要的一个概念。绝大多数编程语言支持函数的自调用,在这些语言中函数可以通过调用自身来进行递归。计算理论可以证明递归的作用可以完全取代循环,因此在很多函数编程语言(如Scheme)中习惯用递归来实现循环。递归能解决的问题:例如:(1)数学上:汉诺塔问题、8皇后问题、阶乘问题、迷宫问题等。(2)算法上:归并排序、快速原创 2020-08-26 11:12:15 · 124 阅读 · 0 评论 -
2020-08-25
栈(基于数组以及JAVA语言的实现)栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。 栈的特点是先进后出的有序列表。以下为栈基本操作(以数组为原理)的图解:(1)定义一个数组(2)定义栈顶并初始化top = -1(3)入栈的操作:原创 2020-08-25 11:09:21 · 154 阅读 · 0 评论 -
2020-08-25
单向环形链表(约瑟夫问题)约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将出圈,最后剩下一个,例如N=5,M=2,出圈的顺序是:2 4 1 5 3。这里使用单向环形链表来处理约瑟夫问题,单向环形链表其实就是在原有单链表的基础上将尾结点指向头结点,从而构成一个单向环形链表。单向环形链表的构建方法:(1)定义一个cur辅助指针接收每次创建好的结点,当创建第一个结点时,把first赋给cur。First指向first构成环(2)把每次创建好的node结点赋给cur(相当于first.n原创 2020-08-25 10:46:14 · 173 阅读 · 0 评论 -
2020-08-24
双链表的基本操作(基于JAVA)双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。单链表只可以从一个方向查找,而双链表可以前后查找。双链表是由data域、next域(指向下一节点)、pre域(指向上一节点)组成的。双链表的应用(对银行账户信息的处理):(1)添加(默认添加到双链表的最后端)首先通过遍历以及辅助指针temp找到最后的这个节点 tem原创 2020-08-24 00:14:34 · 140 阅读 · 0 评论 -
2020-08-23
单链表的具体操作(基于JAVA)单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。即:每个节点包含data域、next域(指向下一个节点)单链表的应用(使用带头结点的单链表实现银行账户的管理):(1)第一种添加节点方法,直接添加到单链表的尾部。 首先创建一个head头结点,里面不存放任何数据内容,作用是原创 2020-08-23 23:50:57 · 134 阅读 · 0 评论 -
2020-08-21
稀疏数组的用法稀疏数组:当一个数组中大部分的元素为0,或者为同一值的数组时,可以采用稀疏数组来保存该数组。通常情况下,我们在棋盘或地图等,会采取该方法存储我们的数据。稀疏数组对该数组的处理方法为: (1)记录数组一共有几行几列,记录有多少个不相同的值 (2)把具有不同值的元素的行列还有值记录在一个相对于较小规模的数组中,从而缩小程序的规模,达到方便存储的作用。以下为图示:原数组: 0 0 0 0 0 0 0 0 0 0 0 0 1 2 0 0 0 0 0 0原创 2020-08-21 15:57:41 · 125 阅读 · 0 评论 -
2020-08-17
#归并排序介绍##归并排序(MergeSort)是利用归并的思想来实现排序方法,采用了经典的分治法,分治法将问题分成一些小的模块再进行递归求解,而治阶段则将分的阶段得到的各种值补在一起,即为先分而治。其时间复杂度为:o(n log n)##通俗来讲:将需要排序的数组递归拆分成最小模块,然后在治递归合并的时候每次进行排序。例子:9 3 4 8 5 7 1 6分: 9 3 4 8 5 7 1 6 9 3 4 8 5 7 1原创 2020-08-17 17:05:57 · 356 阅读 · 0 评论 -
2020-07-06
关于Servlet连接数据库时空指针异常以下是我遇到过可以解决的两种方法:(1)在Tomcat的lib目录下没有添加Mysql相关的jar包,可以在Tomcat目录下增添,也可以在工程下添加。(2)在读取配置文件时用错方法:...原创 2020-07-06 10:56:13 · 83 阅读 · 0 评论