![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java数据结构
文章平均质量分 77
大帅_Sun
投石问路,人自知,
展开
-
时间复杂度——我理解的那种
我讲的是时间复杂度的一般应用,高深的理论分析我不会讲也不懂,见谅。时间复杂度,不论是数据结构还是算法书,保证第一章就会有这个内容,还有一个就是空间复杂度,这个感觉没时间~出名,本文不谈,其实是相比而言这个我不懂。时间复杂度学的时候就很迷糊,考试貌似就是一道题对几种不同的复杂度排序(貌似学过数学就能排对),或者是给你个几层循环的程序让你写出时间复杂度,学的时候虽然不懂但是会套用,几层循环就是原创 2017-03-20 20:48:53 · 1738 阅读 · 0 评论 -
线索二叉树
过完五一快拿不起书了~哎~一本数据结构拖了这么久前面说到用游标类来实现分步遍历,那么线索二叉树就是另一种分步遍历方式。区别在于:二叉树游标类只能从前向后分步遍历二叉树,而线索二叉树既可以从前向后也可以从后向前分步遍历。前面提到的所有遍历中,都没有把遍历时得到的结点的后继结点信息和前驱结点信息保存下来,因此,不能像操作双向链表那样操作二叉树。保存这些信息的常用方法就是建立线索二叉树。注意原创 2017-05-03 14:24:35 · 281 阅读 · 0 评论 -
最小生成树
一个有n个结点的连通图的生成树是原图的极小连通子图,使用不同的寻找方法或从不同的初始结点出发都可以得到不同的生成树。对于n个结点的无向连通图,它的生成树有且只有n-1条边。如果无向连通图是一个带权图,那它的所有生成树中必有一棵边的权值总和最小生成树,那么这棵树就是最小生成树。构造有n个结点的无向连通带权图的最小生成树,必须满足以下条件:(1)构造的最小生成树必须包括n个结点;(2)原创 2017-05-11 16:04:08 · 1474 阅读 · 0 评论 -
最短路径-Dijkstra
首先,提出两点:一、如果把不带权图上的所有边的权值均定义为1,则该不带权图可以归结为带权图;二、如果把无向图中的每一条边(vi,vj)都定义为弧和弧,则该无向图可以归结为有向图。因此不失一般性,我们只用看有向带权图怎么求解最短路径问题就ok。带权图中,从一个结点到另个一结点存在着多条路径,称每一条路径上所经过边的权值之和为该路径上的带权路径长度,那么在两个结点间的所有路径中,路径长度值最小的称原创 2017-05-12 15:29:18 · 413 阅读 · 0 评论 -
哈夫曼树
基本概念:(1)一棵二叉树中定义,从A结点到B结点所经过的分支序列叫A到B的路径,所经过的分支个数叫路径长度;(2)从二叉树的根结点到二叉树中所有叶结点的路径长度之和称为该二叉树的路径长度。若叶结点带有权值,设二叉树有n个带权值叶结点,定义从根结点到二叉树中所有叶结点的路径长度与相应叶结点权值的乘积之和为该二叉树的带权路径长度(WPL)。那么,对于一组具有确定权值的叶结点,可以构造出多个具有不原创 2017-05-04 14:38:27 · 626 阅读 · 0 评论 -
树和二叉树
树:树是一种结点集合,其中每个结点最多只有一个直接前驱结点,但可以有若干个直接后继结点。树的结构表示了数据元素之间的层次关系。常用术语:结点:由数据元素和构造数据元素之间关系的指针组成;结点的度:即结点拥有的子树的个数;叶结点:度为0的结点;树的度:树种所有结点的度的最大值;结点的层次:根节点的层次为0,然后依次加1;树的深度:树中所有结点的层次的最大值;森林:m(m>=0)棵树的集合称为原创 2017-04-22 14:25:28 · 387 阅读 · 0 评论 -
拓扑排序
拓扑排序是指由某个集合上的偏序关系得到该集合上的全序关系。若集合X上的关系R是自反的、反对称的和传递的,则称关系R是集合X上的偏序关系(半序关系)。偏序关系和前面在树中讲过的等价类非常相似。集合X上的偏序关系R说明(设关系R为定义在集合X上的二元关系):(1)若对每一个x∈X,都有(x,x)∈R,则称R是自反的原创 2017-05-13 16:13:01 · 485 阅读 · 0 评论 -
关键路径
AOE网对工程管理问题的表示:在有向图中,如果顶点表示事件,有向边表示活动,有向边上的权值表示活动持续时间,这样的有向图称“边表示活动的网”即AOE网。如下图AOE网中,有10个事件,15个活动。AOE网对比AOV网:(1)AOV网的有向边不考虑权值,而AOE网的有向边考虑权值;(2)AOV网的入度为0的顶点可以有多个,而AOE网入度为0的顶点只有一个;(3)AOV网的原创 2017-05-13 16:15:31 · 3086 阅读 · 0 评论 -
哈希表——概念
在之前讨论的各种数据结构中,数据元素的存放位置是人为给定的,和数据元素本身没有直接关系。这种情况下,存取一个元素只有按地址直接存取和遍历查找两种方法。顺序存储结构和链式存储结构是两种基本的存储结构,哈希表是一种特殊类型的存储结构,它是一种数据元素及其在内存中的位置之间存在某种函数关系的存储结构,如果构造合适,时间效率非常高。哈希表主要是构造一个映射函数,该函数以数据元素为自变量,函数值即为原创 2017-05-14 09:58:51 · 1439 阅读 · 0 评论 -
树与等价类
若集合X上的关系R是自反的,对称的和传递的,则称关系R是集合X上的等价关系,等价关系R说明(设R为定义在X上的二元关系):(1)自反:对于每个x∈X,都有(x,x)∈R;(2)对称:对于任意的x,y∈X,若当(x,y)∈R时,有(y,x)∈R;(3)传递:对于任意的x,y,z∈X,当(x,y)∈R且(y,z)∈R时,有(x,z)∈R。等价关系的实质是将集合中的元素分类,按照R将集合原创 2017-05-05 15:17:54 · 3179 阅读 · 1 评论 -
树与二叉树的转换、树的遍历
树和二叉树不同,可以有0到n个孩子,所以实现起来很麻烦,但我们可以借助树的孩子兄弟表示法把树转换成二叉树。在孩子兄弟表示法中,某个结点的第一个孩子结点的指针是二叉树中其左孩子结点指针,右兄弟结点指针是二叉树中右孩子结点指针。树转换为二叉树过程:(1)树中所有相同双亲结点的兄弟结点之间加一条连线;(2)对树中不是双亲结点的第一个孩子的结点,只保留新添加的该结点与左兄弟结点之间的连线,原创 2017-05-05 16:08:08 · 16372 阅读 · 2 评论 -
哈希表——实现
根据前文的分析,设计一个哈希表,哈希函数采用除留余数法,解决冲突的函数采用开放定址法中的线性探查法。首先设计哈希表项类:package HashTable;/*** @author sun* 创建时间:2017年5月14日上午11:55:18*//*建立哈希表项类 * 因为不确定数组中某个位置是否保存了数据元素 * 所以,要为每个位置设置一个标志,来表示数组元素的当前状态原创 2017-05-14 14:53:38 · 327 阅读 · 0 评论 -
二叉树设计(一)
二叉树链式存储结构下,有两种基本的实现方法:(1)首先设计二叉树结点类,然后在二叉树结点类的基础上,用static成员函数实现对二叉树的操作,把这些函数封装在一个类中。(2)也是在二叉树结点类的基础上,再设计一个二叉树类来实现。大白话翻译:其实第一种方法就是给一个结点的散点类,给一个对二叉树操作(如遍历)的类,然后你要在主函数中通过结点类把一堆散点拼接成树,再用操作类里的函数对树操作。第二种方原创 2017-04-24 09:38:47 · 3443 阅读 · 0 评论 -
二叉树设计(二)
本文学习上文提到的二叉树实现的第二个方法:建立二叉树类。首先补一个知识点:前面我们用递归实现了遍历,那么我们是否能用非递归结构实现遍历呢?答案是:可以的。在递归学习中我们知道转换的方法通常有两种,都要用到堆栈,因此,即便是不分析遍历特点我们也知道是堆栈。分析:前序遍历中,在所有未被访问的结点中,已访问的结点中最后访问(输出)结点的左子树的根结点将最先被访问,因此堆栈设计如下:(1)初始原创 2017-04-24 15:00:42 · 588 阅读 · 0 评论 -
图的基本概念
图是由结点集合及结点间的关系集合组成的一种数据结构,也可以这么理解,图是这样一种结点集合,若规定了其中某个结点为初始结点,则图中每个结点可以有零至多个直接前驱和零至多个直接后继。图G=(V,E),其中V={x|x∈某个数据元素集合},E={(x,y)|x,y∈V}或E={|x,y∈V并且Path(x,y)}。式中(x,y)表示从x到y的一条双向通路,即(x,y)是无方向的;Path(x,y)表原创 2017-05-06 12:38:57 · 499 阅读 · 0 评论 -
图的存储结构
图的信息包括两部分,结点信息和结点间边的信息;结点信息可用线性表(顺序表或单链表)来存储,对于n个结点的图,每个结点都可能与其他n-1个结点成为邻接结点,所以边的信息存储是一个n×n矩阵的存储,主要有邻接矩阵和邻接表两种方法。1、邻接矩阵存储邻接矩阵定义,假设图G=(V,E)有n个结点,即V={v0,v1,...,v(n-1)},E可用矩阵A描述,对于A中的每一个元素aij,满足(1)若(原创 2017-05-07 15:26:04 · 377 阅读 · 0 评论 -
图的遍历
图的遍历方法主要有两种:(1)深度优先遍历,类似于树的先序遍历;(2)广度优先遍历,类似于树的层序遍历。遍历设计三思:(1)图没有首尾之分,所以算法中必须指定访问的第一个结点;(2)图的遍历过程中可能会构成一个回路,造成死循环,所以要考虑到所有的死循环问题;(3)一个结点可能和多个结点都是邻接关系,所以要使一个结点的所有邻接结点按照某种次序被访问。图又分连通图和非连通图,连通图中,从初始结原创 2017-05-09 10:03:41 · 4758 阅读 · 0 评论 -
串的模式匹配算法
模式匹配是在主串(也称目标串)中,从给定的起始位start开始查找是否存在我们需要的子串(也称模式串),如果查找成功返回模式串的第一个字符在主串中的位置,当模式匹配失败,返回-1。常用的模式匹配算法有Brute_Force算法和KMP算法。Brute_Force算法,从force就可以看出是一种蛮力解决的方法。其模式匹配思想是:(1)将模式串的第一个字符与主串的第一个字符对齐放置,比较第一个字原创 2017-04-06 19:37:39 · 1181 阅读 · 0 评论 -
特殊矩阵——稀疏矩阵
对于一个m×n的矩阵,设s为矩阵的元素总个数s=m×n,设t为矩阵中非零元素的个数,满足t稀疏矩阵的零元素非常多,且分布无规律,所以稀疏矩阵的压缩存储方法为:只存储矩阵中的非零元素,按照三元组的形式存储。三元组由非零元素,该元素行下标和该元素列下标三个数据构成,放在一个列数为3的数组中。存储结构又分数组结构和链表结构两个大类,其中链表结构又有一般链表、行指针数组链表和行指针的十字链表存储结原创 2017-04-15 16:26:17 · 1653 阅读 · 0 评论 -
线性表的顺序存储结构
先做个小声明,我是按照课本的章节安排学习的,目前计划是实现书上程序,特别要学习的会自己应用一下。言归正传:线性表的学习有点郁闷,一直不明白它的实际应用,总不能每写个题就先造个轮子,再加上java里有集合存在。不过有一点是必须明白的,就是学习线性表至少能懂得常用的数据存储方式,还是有第一课的重要地位的。对于数据的操作经典的就是:增、删、改、查。所以,我们先来定义一个接口封装一些基本方法。原创 2017-03-21 12:50:59 · 348 阅读 · 0 评论 -
顺序表的应用举例
要求:输入学生信息表并输出学生情况表学号姓名性别年龄2000001张三男202000002李四男212000003王五女22我曾经以为这种表的存储是一行一行的把所有元素按照顺序放到数组,后来才发现,哦,原来可以定义个学生类,属性写在类里,只把学生对象放入容器。老规原创 2017-03-21 14:04:49 · 843 阅读 · 0 评论 -
数组和向量类
数组是n个相同数据类型的数据元素构成的占用一块地址连续的内存单元的有限集合,所以线性结构(包括线性表、堆栈、队列、串、数组和矩阵)的顺序存储结构实际就是使用数组来存储。所以,不像线性表等结构要特意的学习,感觉数组是我们接触程序语言开始就拿来即用的东西。数组的实现机制(内存映像公式):Loc(ai)是ai的内存单元,每个元素的字节数为k。(1)一位数组中Loc(ai) = Loc(a0)+i*k原创 2017-04-07 14:50:41 · 1186 阅读 · 0 评论 -
堆栈学习
堆栈和队列都是特殊的线性表,线性表,堆栈和队列三者的数据元素以及数据元素间的逻辑关系完全相同,差别就是操作上:线性表的插入和删除操作不受限制;堆栈只能在栈顶插入和删除;队列只能在队尾插入,队头删除。堆栈和队列都可以分别用顺序存储结构和链式存储结构。本文谈堆栈:堆栈的插入和删除操作常称为进栈和出栈;因为元素的进出只能在栈顶进行,所以堆栈也称为先进后出表。注意:不是所有的数据元素特定序原创 2017-03-29 14:18:19 · 386 阅读 · 0 评论 -
堆栈应用——括号匹配问题
假设一个算术表达式中包含圆括号()、方括号[]和花括号{}三类括号,要求判断表达式中括号是否正确匹配配对。分析:括号匹配符号后到的括号要最先被匹配,所以满足栈“后进先出”的特点。括号匹配共有四种情况:(1)左右括号配对次序不正确,即存在类似“(]”这种情况;(2)右括号多于左括号;(3)左括号多于右括号;(4)匹配正确。综上:我们可以存储表达式的字符串并按顺序扫描,进行匹配。顺序栈和链原创 2017-03-30 15:44:51 · 2394 阅读 · 0 评论 -
线性表的链式存储结构
链式存储结构是基于指针(Java中用对象的引用来表示指针)实现的,存储方式是给每个数据元素分配一个指针封装到一起,然后用“链子”连接,所以,该结构的特点是数据元素间的逻辑关系表现在结点的链接关系上,它的一个直观的优点就是:数据元素在内存上不一定非要在一片连续的地址上存储。链表主要有单链表、单循环链表和循环双向链表三种。和顺序表一样,只要是线性表肯定方法是共通的只是实现方式不一样,所以我们还原创 2017-03-24 10:30:41 · 1206 阅读 · 0 评论 -
单链表的应用举例
要求:设计一个成员函数,要求在单链表中插入一个数据元素x,并要求插入后单链表中的数据元素从小到大有序排列。思路:很简单,就是拿x从链表第一个元素一个个比较下去,找到合适的位置插入。注意:我们是拿Integer类的x和Node类(结点类)的data数据进行比较分出大小,而不是判断是否相等。Object中的equals只是比较两个对象是否相等。所以我们要借助java.util包里的比较器Com原创 2017-03-24 15:17:17 · 891 阅读 · 0 评论 -
堆栈应用——表达式计算
简述:表达式在我们人类的眼里很直观简单,但想让机器理解并进行计算就是问题了,书里介绍了堆栈来变换表达式形式让机器理解的方法— —中缀表达式变换为后缀表达式,再翻译后缀表达式进行计算。但代码实现竟然只有后缀表达式到计算的这一部分,真是fuck,我又搞了好久才实现中缀变换后缀。在机器内部,任何表达式都是由操作数、运算符和分解符(括号等)组成。本文只讨论简单的算术表达式,即只有数字和加减乘除括号。我原创 2017-04-02 17:18:04 · 3076 阅读 · 0 评论 -
队列学习
队列也是一种线性表,具有两种数据存储结构,队列中只允许在队尾插入和在队头删除,是先进先出表。和堆栈一样我们先定义队列中基本的功能并提供接口:package StackAndQueue;/*** @author sun* 创建时间:2017年4月3日上午10:44:29*//* * 封装队列的常用操作,提供接口: * 入队列append(obj):把数据元素obj插入队尾 *原创 2017-04-03 21:08:08 · 294 阅读 · 0 评论 -
队列应用——回文串判断
队列应用的广泛:操作系统中的各种数据缓冲区的先进先出管理;应用系统中的各种服务请求的排队管理等等。回文串判断可以利用堆栈和队列的配合来解决,具体描述在代码注释中。看代码:(相关类在前文中有定义)package StackAndQueue;/*** @author sun* 创建时间:2017年4月3日下午8:27:42*//*回文串是指一个字符序列以中间字符为基准两边字符完全原创 2017-04-03 21:31:44 · 1178 阅读 · 0 评论 -
优先级队列学习及应用
在有些软件系统中,有时要求把进入队列中的数据元素分优先级,这样出队列时就不是把队头数据输出了,而是选择队列中优先级最高的数据元素出队列,当两个数据元素优先级相同时,仍然按照先进先出原则出队列。只讨论顺序优先级队列,它与顺序循环队列的区别:(1)出队列方式,上段已经陈述。具体操作是先遍历队列找出优先级最高的取出,并把其后的所有元素依次向队头移位。因为存在移位,所以避免了假溢出问题,那么顺序优先级原创 2017-04-04 15:28:50 · 271 阅读 · 0 评论 -
数据结构——集合
集合是具有某种相似特性的事物的全体。它的重要特点是其中的数据元素无序且不重复,这也就是判断是否使用该容器的依据。集合类既可以基于向量类来实现,也可以用其他方法比如基于哈希表来实现,本文讨论基于向量类。首先我们要在上文建立的向量类中添加四个函数,以方便集合类的设计。四个函数如下:public int indexOf(Object element){ if(element == nul原创 2017-04-13 16:32:47 · 303 阅读 · 0 评论 -
串——自定义MyString类
串是一种线性结构,一种特殊的线性表,串的数据元素以及元素间的逻辑关系和线性表完全相同,其差别是:(1)线性表的数据元素可以是任意数据类型,而串的数据元素类型只允许是字符类型;(2)线性表一次操作一个数据元素,而串一次操作若干个数据元素即一个子串。我们把串记作形如s="abcd",其中s称为串名,双引号括起来的字符序列称为串的值,个数称串长度。若两个串相等,则(1)长度相等;(2)各个对应位置字原创 2017-04-05 15:50:52 · 936 阅读 · 0 评论 -
串——自定义MyStringBuffer类
上一篇自定义了MyString类,在字符串操作时不会改变原串的值。本文的MyStringBuffer类作为缓冲串类,在字符串操作时可以改变原串的值,所以必须采用可变长的数组存储结构,比如在字符串连接时数组要先加长自己的空间再将字符串拼接到一起。MyStringBuffer类设计如下:(只写了部分方法)package String;/*** @author sun* 创建时间:20原创 2017-04-05 16:35:41 · 843 阅读 · 1 评论 -
矩阵
矩阵用二维数组来处理最为方便,书上还是采用基于向量类设计矩阵,把一维数组作为对象存放到向量类中,拼接为二维数组。矩阵类:(只实现矩阵加)package ArrayVectorSetMatrix;/*** @author sun* 创建时间:2017年4月13日下午5:10:39*/public class Matrix { private MyVector values;//矩原创 2017-04-15 11:04:45 · 224 阅读 · 0 评论 -
特殊矩阵——n阶对称矩阵
特殊矩阵指:矩阵中有许多值相同的元素(包括0),且这些元素的分布有一定规律。当矩阵的维数比较大时,矩阵占据的内存单元相当多,这时,利用特殊矩阵数据元素的分布规律压缩矩阵的存储空间,对许多应用问题来说有重要是意义。特殊矩阵压缩存储的方法有两种:(1)只存储相同矩阵元素的一个副本;(2)采用不等长的二维数组。方法(1),比如对于n阶对称矩阵,行数和列数都为n,元素以主对角线为中线对称,aij=原创 2017-04-15 15:33:12 · 11769 阅读 · 0 评论 -
二叉树的分步遍历
这个名字起的不太能理解!二叉树的分步遍历是指,在规定了一棵二叉树的遍历方法后,每次只访问当前结点的数据元素,然后使当前结点为当前结点的后继结点(我类个去,绕口令啊),直到达到二叉树的最后一个结点为止,就像操作单链表一样。在看概念:二叉树遍历有两种情况,一种是一次性遍历,如之前提到的四种遍历方法一次性遍历显示二叉树结点的数据元素值;另一种是分步遍历。大白话理解:结合上面两个,我认为是可以原创 2017-04-27 11:21:02 · 522 阅读 · 0 评论