数据结构
无意呢
进击的程序猿
展开
-
Java基础知识复习(十)-- 二叉树排序
二叉树二叉树由各种节点组成二叉树特点:每个节点都可以有左子节点,右子节点每一个节点都有一个值二叉树排序假设通过二叉树对如下10个随机数进行排序67,7,30,73,10,0,78,81,10,74排序的第一个步骤是把数据插入到该二叉树中,插入基本逻辑是,小、相同的放左边,大的放右边67 放在根节点7 比 67小,放在67的左节点30 比67 小,找到67的左节点7,3...原创 2019-01-01 16:39:02 · 164 阅读 · 0 评论 -
【LeetCode 】211. 添加与搜索单词 - 数据结构设计
设计一个支持以下两种操作的数据结构:void addWord(word)bool search(word)search(word) 可以搜索文字或正则表达式字符串,字符串只包含字母 . 或 a-z 。 . 可以表示任何一个字母。示例:addWord("bad")addWord("dad")addWord("mad")search("pad") -> falsesear...原创 2019-01-31 21:58:26 · 274 阅读 · 1 评论 -
【LeetCode】677. 键值映射
实现一个 MapSum 类里的两个方法,insert 和 sum。对于方法 insert,你将得到一对(字符串,整数)的键值对。字符串表示键,整数表示值。如果键已经存在,那么原来的键值对将被替代成新的键值对。对于方法 sum,你将得到一个表示前缀的字符串,你需要返回所有以该前缀开头的键的值的总和。示例 1:输入: insert("apple", 3), 输出: Null输入: s...原创 2019-01-31 22:02:28 · 346 阅读 · 0 评论 -
【数据结构】AVL树
定义:通常高度平衡树用符号HB(k)表示,其中k为左子树和右子树的高度差,k叫做平衡因子在HB(k)中,如果k = 1,那么这样的二叉搜索树叫做AVL树,即一棵AVL树是带有平衡条件的二叉搜索树;左子树和右子树的高度差最多不能超过1。1.AVL树的性质一棵二叉树为AVL树,当且仅当满足如下条件:它是一棵二叉搜索树对任意结点X,其左子树的高度与其右子树的高度的差最多不超过1。...原创 2019-01-27 17:49:58 · 1228 阅读 · 0 评论 -
【数据结构】给定一棵二叉搜索树,判断其是否AVL树
分析因为给出的是二叉搜索树,所以只要判断平衡因子是否为1就可以Java版本实现//获取树的深度 int getDepth(Node<T> root , int initDeep){ if(root == null) return initDeep; int leftDeep = initDeep; int rightDeep = initDeep; i...原创 2019-01-27 21:02:30 · 656 阅读 · 0 评论 -
【数据结构】树、二叉树以及二叉搜索树(二叉排序树、二叉查找树)的实现
删除元素&amp;amp;amp;amp;gt; 树的删除节点操作是最复杂的一项操作。该操作需要考虑三种情况考虑:&amp;amp;amp;amp;gt; 1、该节点没有子节点&amp;amp;amp;amp;gt; 2、该节点有一个子节点&amp;amp;amp;amp;gt; 3、该节点有两个子节点&amp;amp;amp;amp;gt; 第一种没有子节点的情况很简单,只需将父节点指向它的引用设置为null即可:原创 2019-01-22 21:25:28 · 464 阅读 · 0 评论 -
【数据结构】堆和二叉堆
1.什么是堆堆是一棵具有特定性质的二叉树,堆的基本要求是堆中所有结点的值必须大于等于(或小于等于)其孩子结点的值,这也称为堆的性质。堆还有另一个性质,就是当h&amp;amp;amp;gt;0时,所有叶子结点都处于第h或h-1层,也就是说,堆应该是一棵完全二叉树。...原创 2019-01-28 23:24:24 · 1032 阅读 · 0 评论 -
【数据结构】堆应用之堆排序
如何实现堆堆排序首先建立一个最大堆,然后将堆顶元素与末尾元素进行交换,使末尾元素最大。然后调整堆的大小(即堆元素-1),然后继续调整堆,再将堆顶元素与末尾元素交换,得到第二大元素。如此反复进行交换、重建、交换。直至堆剩下一个元素后将得到一个递增的有序序列。Java版本实现//堆排序 public void HeapSort(int[] a , int n ) { while(n ...原创 2019-01-28 21:23:37 · 275 阅读 · 0 评论 -
【数据结构】哈希表(转载)
转载来自:https://www.cnblogs.com/yangecnu/p/Introduce-Hashtable.html在前面的系列文章中,依次介绍了基于无序列表的顺序查找,基于有序数组的二分查找,平衡查找树,以及红黑树,下图是他们在平均以及最差情况下的时间复杂度:可以看到在时间复杂度上,红黑树在平均情况下插入,查找以及删除上都达到了lgN的时间复杂度。那么有没有查找效率更高的数据...转载 2019-02-06 21:48:11 · 218 阅读 · 0 评论 -
【数据结构】哈希表的Java实现
具体理论分析见:https://blog.csdn.net/qq_41900081/article/details/86768476package dataStructure;import java.util.TreeMap;public class HashTable &lt;K , V&gt;{ public static final int upperTol = 10; p...原创 2019-02-06 21:52:31 · 383 阅读 · 0 评论 -
字符串模式匹配算法的 Java 实现
字符串匹配算法:检查模式P是否另一个字符串T(T代表文本)的子串,因为要检查整个定长的字符串P,所以有时这些算法称为精确字符串匹配算法。蛮力法(BF算法)对于文本T中的每个可能的位置,检查P是否匹配,由于文本T的长度为n,模式P的长度m, 所以T的最后m -1个位置无需检查,即有n-m+1个可选的位置来比较。/** * 搜索模式字符串P在文本字符串T中第一次出现的位置的蛮力解...原创 2019-02-21 20:28:39 · 1754 阅读 · 0 评论 -
【数据结构】并查集及其实现
1. 并查集是什么并查集是一种用来管理元素分组情况的数据结构。并查集可以高效地进行如下操作。不过需要注意并查集虽然可以进行合并操作,但是无法进行分割操作。主要操作:查询元素a和元素b是否属于同一组。合并元素a和元素b所在的组。2.并查集的实现方式快速FIND实现(Quick FIND)快速UNION实现(Quick UNION)3.并查集实现1.Quick F...原创 2019-01-31 12:08:55 · 400 阅读 · 0 评论 -
【图算法】最小生成树之普里姆算法
所谓最小生成树,就是用最少的边连接所有的顶点。对于给定的一组顶点,可能又很多种最小生成树,但是最小生成树边E的数量总是比顶点V的数量小1,即E=V-1。普里姆算法 假设N=(V,{E})是连通网,TE是N上最小生成树中边的集合,算法从U=u0(u0∈V)U={u_0}(u_0∈V)U=u0(u0∈V),TE={}开始。重复执行下述操作:在所有u∈U,v∈V-U的边(u,v)∈E中找...原创 2019-03-05 11:34:34 · 455 阅读 · 0 评论 -
【数据结构】哈夫曼树及其应用的Java实现
哈夫曼树的定义路径长度:从树的一个结点到另一个结点之间的分支构成两个结点之间的路径,路径上的分支数目称作路径长度树的路径长度:从树根到每一个结点的路径长度之和。哈夫曼树:如果考虑带权的结点,结点的带权路径长度为从该结点到树根之间的路径长度与结点上权的乘积。树的带权路径长度为树中所有叶子结点的带权路径长度之和,带权路径长度WPL最小的二叉树称为哈夫曼树。哈夫曼树的算法描述根据给定的n个权...原创 2019-03-02 13:32:08 · 740 阅读 · 0 评论 -
【图算法】最小生成树之克鲁斯卡尔算法
最小生成树 在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树。克鲁斯卡尔算法(Kruskal)克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法。**基本思想:**按照权值从小到大的顺序选择n-1条边,并保证这n-1条边不构成回路。**具体做法:**首先构造一个只含n个顶点的森林,...原创 2019-03-05 17:38:40 · 874 阅读 · 0 评论 -
【数据结构】图的一些重要术语
一、图的定义在无向图中,如果任意两个顶点之间都存在边,则称该图为无向完全图,含有n个顶点的无向完全图有n∗(n−1)/2n*(n-1)/2n∗(n−1)/2条边。含有n个顶点的有向完全图有n∗(n−1)n*(n-1)n∗(n−1)条边。有些图的边或弧具有与它相关的数字,这种与图的边或弧相关的数叫做权 。带权的图称为网。无向图的边数等于各顶点度数和的一半,多出一半是因为重复两次计数 。...原创 2019-03-03 20:55:08 · 248 阅读 · 0 评论 -
【数据结构】Java实现图的深度优先搜索与广度优先搜索
在图中实现的基本操作之一就是搜索从一个顶点可以到达其他哪些顶点,或者找所有当前顶点可到达的顶点。有两种常用的方法可用来搜索图:深度优先搜索(DFS)和广度优先搜索(BFS),它们最终都会到达所有的连通顶点。深度优先搜索通过栈来实现(类似于树的前序遍历,树的前序遍历就是深度优先搜索的特殊版本),而广度优先搜索通过队列来实现(类似于树的层次遍历,树的层次遍历就是广度优先搜索的特殊版本)。具体的见下面的...原创 2019-03-04 20:13:28 · 438 阅读 · 0 评论 -
字典树的实际应用场景之敏感词过滤(附 Java 实现代码)
文章目录前言敏感词过滤Trie 实现敏感词的过滤Java 代码实现前言这篇文章主要介绍怎么用字典树实现敏感词的过滤,关于字典树的一些介绍可以参考其他文章,也看一下我的另一篇文章:Trie(字典树,前缀树)及其实现;敏感词过滤在很多场景都会用到敏感词过滤,比如在网站提交的内容,游戏中的聊天等等…那么这些敏感词是如何被过滤掉的呢?其实这就是一个字符串的匹配过程,我们很容易就可以想到的就是准备一...原创 2019-07-13 21:43:18 · 1137 阅读 · 0 评论 -
【数据结构】Trie(字典树,前缀树)及其实现
理解Trie:Trie又称单词查找树,是一种树形结构,是哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。优点:非常适合操作字符串,利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。缺点:虽然不同单词共享前缀,但其实trie是一个以空间换时间的算法,每个结点只存储一个字符浪费了Tr...原创 2019-01-31 21:47:06 · 657 阅读 · 0 评论 -
【数据结构】给定一个有序双链表,设计算法将其转换为平衡二叉搜索树
思路:找到有序链表的中间结点作为根结点,然后找到中间结点之前所形成的新链表的中间结点作为左孩子结点,再找到中间结点之后所形成的新链表的中间结点作为右孩子结点,Java版本实现//打印平衡二叉树 void display(DDLNode root) { System.out.print(&quot;先序遍历线索二叉树:&quot;); preOrder(root); System.out.print...原创 2019-01-26 12:03:43 · 204 阅读 · 0 评论 -
【数据结构】顺序表
顺序表示一种最为简单的线性结构,可以分为两种,一种是静态顺序表,一种是动态顺序表1)静态顺序表所谓静态顺序表是指一旦定义了该表,其大小始终固定不变,函数调用时,静态顺序表在函数栈上开辟空间,我们熟悉的数组就是一种静态顺序表e.g #definde MAXSIZE 100 ElemType Sqlist[MAXSIZE]; int len;2)动态顺序表所谓动态顺序表...原创 2019-01-17 19:21:44 · 5774 阅读 · 2 评论 -
【数据结构】两个有序数组的交集的java实现
题目:给定两个有序整型数组array_1和array_2,数组的元素是递增的,且数组中没有重复的元素,计算array_1和array_2的交集。常规解法:二路归并//求两个有序数组的交集 static int getIntersection(int array_1[],int len1,int array_2[],int len2,List&lt;Integer&gt; c) { ...原创 2019-01-17 21:10:23 · 2364 阅读 · 0 评论 -
【数据结构】判断数组中的元素是否连续的java实现
题目:现有一个整数数组元素是0~65535之间的任意数字,已知相同数字不会重复出现,而0可以重复出现,且0可以通配任意一个数字,设计一个算法判断该数组是否连续。注意:1)数组中的数据可以乱序2)0可以出现多次题目分析:如果一个包含n个数据的数组是连续的,那么最大值和最小值之差一定0为n-1;如果包含0的话,那么最大值和最小值之差不能超过n-1。package dataStruc...原创 2019-01-17 21:41:38 · 2306 阅读 · 0 评论 -
【数据结构】判断数组中是否有重复元素的java实现
题目:给定一个长度为N的数组,其中每个元素的取值范围都是1~N,判断数组中是否有重复的数字问题分析:1.最简单暴力的方法是用双层嵌套对每两个数字进行比较,看是否相等但是时间复杂度太高,不予采用。2.也可以先排好序,然后遍历数组,y进行相邻元素的比较,同意时间复杂度太高,不予采用。3.也可以开辟一个新数组,用来记录原数组中每个元素出现的次数,但增大了空间开销。4.假如数组中没有重复...原创 2019-01-17 22:02:24 · 7287 阅读 · 4 评论 -
【数据结构】单链表
单链表是一种线性数据结构,每个元素都存放在链表的一个结点中,结点之间由指针串联在一起,这样就形成了一条如同链的结构,固称作链表。**所谓单链表顾名思义就是只能单方向遍历的链表。**如下图所示:单链表的基本操作单链表最基本的操作包括创建一个单链表、向单链表中插入结点、从单链表中删除结点等。java版本的实现package dataStructure;public class N...原创 2019-01-18 14:43:15 · 283 阅读 · 0 评论 -
数据结构与算法(java版)
转自:http://blog.csdn.net/column/details/datastructureinjava.html目录(1)数据结构与算法概念解析(2)数据结构之数组(3)数据结构之栈(4)数据结构之队列(5)数据结构之链表(6)数据结构之二叉树(7)数据结构之霍夫曼树(8)数据结构之红黑树(一)——基础分析(9)数据结构之红黑树(二)——插入操作(10)数据结构...转载 2019-01-18 14:46:06 · 163 阅读 · 0 评论 -
【数据结构】线索二叉树
1. 线索二叉树普通二叉树在存储过程中如果树结点没有孩子域,那么它将指向空指针,这样就浪费了大量存储空间,在一棵有n个结点的普通二叉树中,每个结点有两个指针域,整棵树有2n个指针域,树中有n-1条边,所有有2n-(n-1) = n+1个空指针,从存储空间的角度来看,这n+1个空指针域浪费了内存资源。而在遍历二叉树的几种递归方法中,都利用了栈,在一定程度上也浪费了内存资源,层次遍历则是利用队列来实...原创 2019-01-24 10:07:54 · 412 阅读 · 0 评论 -
【数据结构】双链表
双链表的优点:对于链表中的一个结点,拥有两个指针,一个指向前驱结点,一个指向后继结点,因此可以从两个方向继续操作双链表的缺点:1) 每个结点需要议案家一个额外的指针,因此需要更多的空间开销2)结点的插入或删除操作更加费时(需要更多的指针操作)、双链表的基本操作插入操作1)前插2)尾插3)中间插入删除操作1)删除头结点2)删除尾结点3)删除中间结点Java...原创 2019-01-18 21:45:11 · 241 阅读 · 0 评论 -
【数据结构】循环链表
循环链表循环链表与普通链表的操作非常相似,只不过循环链表没有采用NULL值表示链表的结束,所以当遍历循环链表的时候要特别小心,否则将会无限地遍历链表,因为在循环链表中每个结点都有后继结点,最后一个结点的后继结点为表头结点。所以循环链表的遍历的结束条件为curentNode == headNode主要操作统计循环链表的结点个数插入操作1)前插2)尾插3)中间插入删除操作1)...原创 2019-01-19 11:00:07 · 264 阅读 · 0 评论 -
【数据结构】栈的三种实现
定义栈是一个有序线性表,只能在表的一端(称为栈顶,top)执行插入和删除操作,最后插入的元素第一个被删除,是一种后进先出(FILO)的线性表栈的操作1. 主要操作void push(int data):入栈,将数据插入栈。int pop():出栈,删除并返回最后一个插入栈的元素2.辅助操作int pop():返回最后一个插入栈的元素,但不删除。int size():...原创 2019-01-19 16:47:01 · 776 阅读 · 0 评论 -
【数据结构】如何使用栈来判定括号是否匹配
题目:先定义堆栈的几个基本操作,再设计一主函数利用堆栈的操作完成以下功能:假设一个算术表达式中可以包含三种括号:()[]{},且这三种括号可以按任意次序嵌套使用(如:…[…{…}…[…]…]…(…))。编写判别给定表达式中所含括号是否正确配对出现的算法。算法:a)创建一个栈b)当(当前字符不等于输入的结束字符)如果当前字符不是括号符,则忽略它如果字符是一个开分隔符(如【,{,)...原创 2019-01-19 22:17:40 · 5707 阅读 · 0 评论 -
【数据结构】链式存储结构的基本操作
一、实验目的掌握单链表,链式堆栈,链式队列的定义及基本操作二、使用仪器、器材笔记本一台操作系统:Win7编程软件:DevC++三、实验内容及原理(一)单链表的定义及基本操作用带表头的链表存放输入的数据,每读入一个数,按升序顺序插入到链表中,链 表中允许两个结点有相同值。链表的头结点存放链表后面的结点个数,初始化时 就生成头结点(初值为 0)。在上述带表头的链表中删除第...原创 2019-01-19 22:57:57 · 1838 阅读 · 0 评论 -
【数据结构】判断给定的二叉树是否为BST树(二叉搜索树)
分析:对于每个结点,需要检查其左子树中的最大值是否小于当前结点的值,且右子树中的最小值是否大于当前结点的值而我们知道对于一棵二叉树搜索树来说,其每一棵子树也都是二叉搜索树,且其最小值为最左边的结点,最大值为最右边的结点。所以反过来讲,就是如果一棵普通二叉树的任意一棵左子树中的最大值(左子树的最右边结点)大于等于当前根结点或者任意一棵右子树的最小值(右子树的最左边结点)小于当前根结点,那么这...原创 2019-01-24 22:22:24 · 1897 阅读 · 0 评论 -
【数据结构】如何利用栈将中缀表达式转换为后缀表达式
两种表达式中缀后缀A+BAB+A+B*CABC*+(A+B)*C-DAB+C * D-重要性质中缀表达式1+24和后缀表达式124+中,数字顺序是一样的,只有算术符号顺序不一样只需一个栈就可以把中缀转后缀,利用栈把表达式中的运算符次序从中序改为后序。栈中只存放运算符和左括号,由于后缀表达式中不存在括号,所以输出的时候将不输出括号。算法a...原创 2019-01-20 14:25:38 · 3996 阅读 · 0 评论 -
【数据结构】计算后缀表达式的值
题目我们平常使用的计算表达式都是中缀表达式,而输入计算机后会转换为后缀表达式,即计算机只能计算后缀表达式,那么如何将一个中缀表达式转换为一个后缀表达式?算法1)从左到右扫描后缀表达式字符串 2)初始化一个空栈 3)如果扫描到数字,那么就直接入栈4)如果被扫描的字符是一个二元运算符,那么就连续出栈两次,获得两个字符,元素出栈后,应用运算符进行计算,并将结果压栈5)重复3)和4)的操作...原创 2019-01-20 17:33:46 · 4199 阅读 · 1 评论 -
【数据结构】队列的三种实现方式
1.定义队列是一种只在一端插入(队尾),另一端删除(队首)的有序线性表,队列中第一个插入的元素也是第一个被删除的元素,所以,队列是一种先进先出(FIFO)线性表。2.操作1)主要操作void addQueue(T data):入队,在队尾插入一个元素T removeQueue():出队,删除并返回队首元素。2)辅助操作boolean isEmpty():指明队列是否...原创 2019-01-20 23:46:13 · 2266 阅读 · 0 评论 -
【数据结构】队列的相关问题
问题1:设计一个逆置队列元素的算法,要求算法在访问队列元素时,只能使用队列抽象数据类型中的操作。分析:队列的出队操作队首元素,入队操作队尾元素,如果只是直接把队首出队放到队尾入队,那么遍历一次之后队列的顺序将不会改变。所以我们要借助一个栈临时存放数据来实现队列的逆置算法,把队列中的元素依次出队后压栈,队空之后,再把栈中的元素依次出栈,然后入队,等到栈空之后,队列中的元素顺序就逆置了。Ja...原创 2019-01-21 11:40:56 · 744 阅读 · 0 评论 -
关于 KMP 算法的个人理解(附 Java 实现代码)
为什么会提出 KMP 算法为了解决传统的朴素算法匹配字符串的低效为什么朴素算法会低效传统的朴素算法在匹配字符串失败的时候,主串和模式串都要回溯,主串回溯到匹配起始位置加1, 模式串回溯到第一个字符,从头开始匹配,这样会产生很多不必要的回溯,所以朴素算法低效。时间复杂度为O( (n - m +1)* m),即O(n * m)。KMP 算法的思想既然朴素算法会产生不必要的回溯,那么就要想办法...原创 2019-07-22 14:17:06 · 244 阅读 · 0 评论