数据结构
如是说如是
读史使人明智
读诗使人灵秀
数学使人周密
科学使人深刻
伦理学使人庄重
逻辑修辞之学使人善辩
展开
-
字典树
package 字典树;import java.util.LinkedList;public class TrieNode { TrieNode preNode = null; int isEnd = 0; int deep = 0; char content = '0'; LinkedList<TrieNode> child = new LinkedList<TrieNode>(); TrieNode() { } public TrieNo原创 2020-08-16 17:34:33 · 363 阅读 · 0 评论 -
简单选择排序实现(Java)
简单选择排序实现简单选择排序就是通过n-i次关键字之间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i (1 ≤ i ≤ n)个记录交换。代码实现:public class SelectSort { //置换 public void swap(int[] elem, int i, int j) { int temp = elem[i]; elem[i] = elem...原创 2019-03-15 19:31:41 · 593 阅读 · 2 评论 -
冒泡排序实现(Java)
冒泡排序是一种交换排序,它的基本思路是:两两比较相邻记录的关键字,如果反序则交换,知道没有反序的记录位置。依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因...原创 2019-03-15 18:30:35 · 401 阅读 · 0 评论 -
数据结构---排序的基本概念和分类
排序的定义假设含有n个记录的序列为{r1r_1r1,r2r_2r2,…,rnr_nrn},其相应的关键字分别为{k1k_1k1,k2k_2k2,…,knk_nkn},需确定1,2, 3, …, n的一种排列p1p_1p1,kpk_pkp,…,pnp_npn,使其相应的关键字满足kp1k_{p1}kp1 ≤kp2k_{p2}kp2≤…≤kpnk_{pn}kpn非递减(或非...原创 2019-03-15 17:44:30 · 324 阅读 · 0 评论 -
数据结构---散列表查找(哈希表)概述和简单实现(Java)
散列表查找定义散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,是的每个关键字key对应一个存储位置f(key)。查找时,根据这个确定的对应关系找到给定值的key的对应f(key)。我们把这种对应关系f称为散列函数,又称哈希(Hash)函数,按这个思想,采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间成为散列表或哈希表。关键字对应的记录存储位置我们成为散列地址。...原创 2019-03-15 15:32:33 · 1264 阅读 · 0 评论 -
数据结构---线性索引查找
引言数据结构的最终目的是提高数据的处理速度,索引是为了加快查找所读而设计的一种数据机构。索引就是把一个关键字与它对应的记录相关联的过程一个索引由若干个索引项构成,每个索引项至少包含一个关键字和其对应的记录在存储器中的位置等信息。索引技术是组织大型数据库以及磁盘文件的一种重要技术。索引按照结构可以分为线性索引、树形索引、多集索引。线性索引就是将索引项集合组织为线性结构,也称为索引表。稠密索引...原创 2019-03-11 10:18:50 · 363 阅读 · 0 评论 -
有序表查找---斐波那契查找
注意:斐波那契查找的前提和折半查找和插值查找的条件相同,即待查找的查找表必须是顺序存储且有序。 斐波那契查找与折半查找很相似,他是根据斐波那契序列的特点对有序表进行分割的。他要求开始表中记录的个数为某个斐波那契数小1,及n=f(k)-1。开始将key值与第f(k-1)位置的记录进行比较(及mid=lo...原创 2019-03-10 22:43:47 · 287 阅读 · 0 评论 -
有序表查找---插值查找
插值查找和折半查找的思想是一样的,其代码机构也基本和折半查询相同://折半查找 public int Binary_Search(int[] a, int n, int key) { int low = 1, high = n, mid; while(low <= high) { mid = (int)((low + high) / 2); if(key < a...原创 2019-03-10 20:31:24 · 164 阅读 · 0 评论 -
有序表查找---折半查找算法
折半查找概念折半查找,又称二分查找。前提是线性表中的记录必须是关键码有序(由小到大或由大到小),线性表必须采用顺序存储。折半查找的基本思想是:在有序表中,取中间值为比较对象,如果给定的值和中间值的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定的值大于中间值的关键字,则在中间记录的右半区继续查找。重复上述过程,直到查找成功,或查找所有区域无记录,返回...原创 2019-03-10 20:00:31 · 20889 阅读 · 2 评论 -
数据结构---平衡查找树之B树和B+树(转)
本文转载自:http://www.cnblogs.com/yangecnu/p/Introduce-B-Tree-and-B-Plus-Tree.html前面讲解了平衡查找树中的2-3树以及其实现红黑树。2-3树种,一个节点最多有2个key,而红黑树则使用染色的方式来标识这两个key。维基百科对B树的定义为“在计算机科学中,B树(B-tree)是一种树状数据结构,它能够存储数据、对其进行排序并...转载 2019-03-14 21:16:32 · 172 阅读 · 0 评论 -
希尔排序的理解和实现(Java)
希尔排序原理希尔排序(shell sort)这个排序方法又称为缩小增量排序,是1959年D·L·Shell提出来的。该方法的基本思想是:设待排序元素序列有n个元素,首先取一个整数increment(小于n)作为间隔将全部元素分为increment个子序列,所有距离为increment的元素放在同一个子序列中,在每一个子序列中分别实行直接插入排序。然后缩小间隔increment,重复上述子序列划...原创 2019-03-15 22:34:05 · 128 阅读 · 0 评论 -
直接插入排序实现(Java)
直接插入排序介绍 直接插入排序的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。 怎么理解呢?就是将n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素,排序过程中每次从无序表中取出第一个元素,将其插入到有序表中的指定位置,...原创 2019-03-15 21:11:34 · 165 阅读 · 0 评论 -
堆排序(最大堆)的理解和实现(Java)
堆的定义堆是具有下列性质的完全二叉树:每个节点的值都大于或等于其左右孩子节点的值,称为大顶堆;或者每个节点的值都小于或等于其左右孩子的值,称为小顶堆。如下图举例:通过堆的定义可知,根节点一定是对中所有节点的最大(小)值。较大(小)的节点靠近根节点(并不绝对,比如上图小顶堆中60, 40均小于70,但它并没有70靠近根节点)按层序方式给节点从1开始编号,则节点之间满足下列关系:{ki≥k2...原创 2019-03-16 17:07:17 · 2264 阅读 · 0 评论 -
B树和B+树的插入、删除图文详解(转)
转载自:https://www.cnblogs.com/nullzx/p/8729425.html简介:本文主要介绍了B树和B+树的插入、删除操作。写这篇博客的目的是发现没有相关博客以举例的方式详细介绍B+树的相关操作,由于自身对某些细节也感到很迷惑,通过查阅相关资料,对B+树的操作有所顿悟,写下这篇博客以做记录。由于是自身对B+树的理解,肯定有考虑不周的情况,或者理解错误的地方,请留言指出。...转载 2019-07-15 11:19:59 · 1604 阅读 · 2 评论 -
基数排序的理解和实现(Java)
基数排序是桶排序的扩展算法,其思想是:将整数按位数切割成不同的数字,然后按每个位数分别比较排序。算法流程:将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。通过基数排序对数组{53, 3, 542, 748, 14, 214, 154, 63, 616},它的示意图如下:在...原创 2019-04-09 14:13:24 · 213 阅读 · 0 评论 -
桶排序和计数排序的理解实现和比较(Java)
比较和非比较的区别常见的快速排序、归并排序、堆排序、冒泡排序等属于比较排序。在排序的最终结果里,元素之间的次序依赖于它们之间的比较。每个数都必须和其他数进行比较,才能确定自己的位置。比较排序的优势是,适用于各种规模的数据,也不在乎数据的分布,都能进行排序。计数排序、基数排序、桶排序则属于非比较排序,通过确定每个元素之前,应该有多少个元素来排序。针对数组arr,计算arr[i]之前有多少个元素,...原创 2019-04-08 15:38:11 · 756 阅读 · 1 评论 -
静态树表查找算法---次优查找树
转载自:https://www.cnblogs.com/ciyeer/p/9067098.html有关在静态查找表中对特定关键字进行顺序查找、折半查找或者分块查找,都是在查找表中各关键字被查找概率相同的前提下进行的。例如查找表中有 n 个关键字,表中每个关键字被查找的概率都是 1/n。在等概率的情况,使用折半查找算法的性能最优。而在某些情况下,查找表中各关键字被查找的概率是不同的。例如水...转载 2019-03-30 22:38:52 · 1324 阅读 · 1 评论 -
平衡二叉树(AVL)的理解和实现(Java)
AVL的定义平衡二叉树:是一种特殊的二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1。从平衡二叉树的名字中可以看出来,它是一种高度平衡的二叉排序树。那么什么叫做高度平衡呢?意思就是要么它是一颗空树,要么它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度只差的绝对值绝对不超过1。平衡因子:将二叉树上节点的左子树深度减去右子树深度的值称为平衡因子BF。则平衡二叉树上所有节点的平衡...原创 2019-03-13 20:48:40 · 4615 阅读 · 7 评论 -
二叉排序树的理解和实现(Java)
二叉排序树的定义和性质二叉排序树又称二叉排序树。它或者是一个空树,或者是一个具有下列性质的二叉树:若它的左子树不空,则左子树上所有节点的值均小于它的根结构的值若它的右子树不空,则右子树上所有结点的值均大于它的根节点的值它的左、右子树也分别是二叉排序树如下图是一个二叉排序树:下面的代码(Java实现)基本全部基于递归实现(非递归操作复杂且效率高),简单的实现了BST的这些操作:初始...原创 2019-03-12 15:12:53 · 9046 阅读 · 5 评论 -
快速排序的理解和实现(Java)
快速排序介绍快速排序(Quick Sort)使用分治法策略,其基本思想是:通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另外一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。快排流程:从数列中选取一个基数将所有比基数小的摆放在基数前面,所有比基数大的摆在基数的后面(相同的数可以到任一边);在这个分区退出之后,该基准就处于数列的中间...原创 2019-03-16 22:34:23 · 447 阅读 · 0 评论 -
归并排序的理解和实现(Java)
归并排序介绍归并排序(Merge Sort)就是利用归并的思想实现的排序方法。它的原理是假设初始序列含有fn个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到[n2\frac{n}{2}2n]([x]表示不小于x的最小整数)个长度为2或1的有序子序列;在两两归并,…,如此重复,知道得到一个长度为n的有序序列为止,这种排序方法称为2路归并排序。根据具体的实现,归并排...原创 2019-03-16 20:16:37 · 740 阅读 · 0 评论 -
基本查找算法---顺序表查找
查找概论查找表是由同一类型的数据元素(或记录)构成的集合。关键字是数据元素中某个数据项的值,又称为键值,用它来标示一个数据元素。也可以标示一个记录的某个数据项(字段)的值,称之为关键码。若此关键字课可以唯一的标示一个记录,那么此关键字为主关键字。主关键字所在的数据项称为主关键码。对于那些可以识多个数据元素(或记录)的关键字,我们称之为此次关键字。次关键字可以理解为是不以唯一标示一个数据元...原创 2019-03-10 14:56:06 · 287 阅读 · 0 评论 -
图的基础---关键路径理解和实现(Java)
引言 之前所说的拓扑排序是为了解决一个工程能否顺利进行的问题。但在生活中,我们还会经常遇到如何解决工程完成需要的最短时间问题。 举个例子,我们需要制作一台汽车,我们需要先造各种各样的零件,然后进行组装,这些零件基本上都是在流水线上同时成产的。加入造一个轮子需要0.5天的时间,造一个发动机需要3天的时间,...原创 2019-03-10 13:43:03 · 5539 阅读 · 1 评论 -
多路查找树---2-3树和2-3-4树的深入理解
引言二叉排序树简单的实现在多数情况能够达到预期的查找效率,但是每个节点只能存储一个元素和只能有两个孩子,使得在大量数据下会造成二叉排序树的深度特别大,那么在进行查找时多次的访问会造成查找效率的下降,同时,在对二叉查找树进行插入时,可能会破坏二叉查找树的平衡。为了降低对于树的访问次数,实现树的平衡,我们需要新的数据结构来处理这样的问题。多路查找树多路查找树的每一个节点的孩子树可以多于两个,且每...原创 2019-03-14 12:35:45 · 860 阅读 · 0 评论 -
哈弗曼树的理解和实现(Java)
哈弗曼树概述哈弗曼树又称最优树,是一种带权路径长度最短的树,在实际中有广泛的用途。哈弗曼树的定义,涉及路径、路径长度、权等概念。哈弗曼树可以用于哈弗曼编码,用于压缩,用于密码学等。哈弗曼树的一些定义路径:从树中的一个结点到另一个结点之间的分支构成这两个结点的路径,路径长度:路径上的分支数目称为路径长度。树的路径长度:从树根到每一个结点的路径长度之和,我们所说的完全二叉树就是这种...原创 2019-02-23 14:12:34 · 251 阅读 · 0 评论 -
栈的理解和代码实现(java)
从数据结构的角度来看,其实栈也是线性表。特殊性在于栈和队列的基本操作是线性表操作的子集,栈是操作受限制的线性表。栈的定义栈是限定仅在表尾进行插入或者删除操作的线性表。对于一个栈来说,表尾端有着特殊的含义,称为栈顶,表头端称为栈底,不含元素的空表称之为空栈,栈又称为后进先出的线性表,简称 LIFO(Last In First Out)结构。也就是说后存放的先取,先存放的后取,这就类似于我们要...原创 2019-02-12 16:02:24 · 157 阅读 · 0 评论 -
树、森林和二叉树的转换
树转换为二叉树(1)加线。在所有兄弟结点之间加一条连线。(2)去线。树中的每个结点,只保留它与第一个孩子结点的连线,删除它与其它孩子结点之间的连线。(3)层次调整。以树的根节点为轴心,将整棵树顺时针旋转一定角度,使之结构层次分明。(注意第一个孩子是结点的左孩子,兄弟转换过来的孩子是结点的右孩子)  ...转载 2019-02-22 13:42:20 · 154 阅读 · 0 评论 -
后序线索化二叉树(Java版)
前面介绍了前序线索化二叉树、中序线索化二叉树,本文将介绍后序线索化二叉树。之所以用单独的一篇文章来分析后序线索化二叉树,是因为后序线索化二叉树比前序、中序要复杂一些;另外在复习线索化二叉树的过程中,大部分讲解数据结构的书籍中都是以中序线索化为例,在网上搜索也很少有详细讲解前序、后序线索化的文章,对于使用Java语言编写的代码更是凤毛麟角,因此决定把个人的理解过程记录下,并分享给有需要的...转载 2019-02-22 11:35:35 · 1983 阅读 · 2 评论 -
线索二叉树的理解和实现(Java)
线索二叉树的基本概念我们按某种方式对二叉树进行遍历,将二叉树中所有节点排序为一个线性序列,在该序列中,除第一个结点外每个结点有且仅有一个直接前驱结点;除最后一个结点外每一个结点有且仅有一个直接后继结点。在有N个节点的二叉树中需要利用N+1个空指针添加线索,这是因为在N个节点的二叉树中,每个节点有2个指针,所以一共有2N个指针,除了根节点以外,每一个节点都有一个指针从它的父节点指向它,所以一...原创 2019-02-22 11:13:44 · 262 阅读 · 0 评论 -
彻底理解线索二叉树
一、线索二叉树的原理 通过考察各种二叉链表,不管儿叉树的形态如何,空链域的个数总是多过非空链域的个数。准确的说,n各结点的二叉链表共有2n个链域,非空链域为n-1个,但其中的空链域却有n+1个。如下图所示。 因此,提出了一种方法,利用原来的空链域存放指针,指向树中其他结点。这种指针称为线索。...转载 2019-02-21 14:01:24 · 577 阅读 · 0 评论 -
对称矩阵与压缩存储算法(java实现)
package 数组和矩阵;public class DuiChenJuZhenYaSuo { int[] arr; int order; //矩阵的阶数 int n; //压缩后一位数组的个数 public DuiChenJuZhenYaSuo(int order) { this.n= order * (order + 1) / 2; this.arr = new i...原创 2019-02-15 15:28:49 · 892 阅读 · 0 评论 -
数据结构-数组与压缩矩阵
转载自:https://blog.csdn.net/zwx19921215/article/details/84303646 数组的定义数组是由n(n>1)个具有相同数据类型的数据元素a1...an组成的有序序列,且该序列必须存储在一块地址连续的存储单元中。1.数组中的数组元素就有相同的数据类型2.数组是一种随机存取结构,给定一组下标就可以访问与其对...转载 2019-02-15 15:25:24 · 1378 阅读 · 0 评论 -
数据结构基础 ---- 数组的理解和实现(Java)
什么是数组数组是由类型相同的数据元素构成的有序集合,每个元素称为数组元素,每个元素受n(n>= 1)个线性关系的约束,每个元素在n个线性关系中的序号i1, i2, ....., in称该元素的下标,可以通过下标访问该数据元素。数组可以看成是线性表的推广,其特点是结构中的元素本身可以是具有某种结构的数据,但属于同一数据类型。(注:出自数据结构严蔚敏c语言版第二版第四章)数组的存储方...原创 2019-02-15 15:22:06 · 231 阅读 · 0 评论 -
队列的理解和实现(一) ----- 循环队列(java实现)
什么是队列我们都知道栈是先进后出的一种线性表,与之相反的是,队列是一种先进先出的线性表。它只允许在表的一端进行插入,而在另一端进行删除。举个例子来说,在生活中我们买东西需要进行排队,最先排队的可以最早的离开队伍,而排在最后面的需要最后离开队伍。在队列当中,允许插入的一端称为队尾,而允许删除的一段称为队头。和栈与线性表类似,队列也分为顺序队列和链队列。普通队列所存在的问题在使用数组实现的...原创 2019-02-13 20:01:10 · 598 阅读 · 0 评论 -
线性表中顺序表的的理解和实现(java)
线性表的顺序表示指的是用一组地址连续的存储单元以此存储线性表的数据元素,这种表示也称作线性表的顺序存储结构或顺序映像。通常,称这种存储结构的线性表为顺序表。特点是:逻辑上相邻的数据元素,其物理次序上也是相邻的。 顺序表的存储示意图 假设线性表的每个元素与占用l个存储单元,并以所占的第一个单元的存储地址作为数据元素的存储起始位置。则线性表中地i+1个数据元素的存储位置LOC(...原创 2019-01-19 21:28:22 · 244 阅读 · 0 评论 -
图的最小生成树的理解和实现:Prim和Kruskal算法
最小生成树一个连通图的生成树是一个极小的连通子图,它含有图中所有的顶点,但只有足以构成一棵树的n-1条边。我们将构造连通网的最小代价生成树称为最小生成树(Minimum Cost Spanning Tree)。普利姆算法(Prim)定义假设G=(V,E)是连通的,TE是G上最小生成树中边的集合。算法从U={u0}(u0∈V)、TE={}开始。重复执行下列操作:在所有u∈U...原创 2019-03-04 14:20:39 · 1036 阅读 · 1 评论 -
有向图的拓扑排序的理解和简单实现(Java)
如果图中存在环(回路),那么该图不存在拓扑排序,在这里我们讨论的都是无环的有向图。什么是拓扑排序一个例子对于一部电影的制作过程,我们可以看成是一个项目工程。所有的工程都可以分为若干个"活动"的自工程。在这些活动之间,通常会受到一定的条件约束,如其中某些活动必须在另一些活动完成之后才能开始。比如,电影制作不可能在人员到位进驻场地时,导演还没有找到,也不可能在拍摄过程中,场地都没有。这些听起来就...原创 2019-03-08 22:42:24 · 2631 阅读 · 1 评论 -
图的最短路径---弗洛伊德(Floyd)算法浅析
算法介绍和Dijkstra算法一样,Floyd算法也是为了解决寻找给定的加权图中顶点间最短路径的算法。不同的是,Floyd可以用来解决“多源最短路径”的问题。算法思路算法需要引入两个二维数组ShortPathTable和Patharc。ShortPathTable表示顶点到顶点的最短路径权值和的矩阵,Patharc表示对应顶点的最小路径的前驱矩阵。在为分析任何顶点之前,ShortPathTa...原创 2019-03-08 15:34:57 · 327 阅读 · 0 评论 -
图的最短路径---迪杰斯特拉(Dijkstra)算法浅析
什么是最短路径在网图和非网图中,最短路径的含义是不一样的。对于非网图没有边上的权值,所谓的最短路径,其实就是指两顶点之间经过的边数最少的路径。对于网图,最短路径就是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点为源点,最后一个顶点为终点。解决最短问题的算法Dijkstra算法Floyd算法SPFA算法Dijkstra算法描述算法的特点:Dijkstra算法使...原创 2019-03-08 14:07:44 · 431 阅读 · 0 评论 -
Java实现BF算法
package 串的算法;public class BF { public static void main(String[] args) { String a = "aaabbaaaccssdd"; String b = "acc"; System.out.println(bfFind(a, b, 3)); } public static int bfFind...原创 2019-02-14 15:10:02 · 1182 阅读 · 0 评论