Java数据结构
jwz934738949
这个作者很懒,什么都没留下…
展开
-
Java数据结构——分治算法实现汉诺塔问题
当我们求解某些问题时,由于这些问题要处理的数据相当多,或求解过程相当复杂,使得直接求解法在时间上相当长,或者根本无法直接求出。对于这类问题,我们往往先把它分解成几个子问题,找到求出这几个子问题的解法后,再找到合适的方法,把它们组合成求整个问题的解法。如果这些子问题还较大,难以解决,可以再把它们分成几个更小的子问题,以此类推,直至可以直接求出解为止。这就是分治的基本思想。汉诺塔问题使用分治算法,假设有5个盘子要从A到C,则把前4个盘子看做一个整体。先将前4个盘子从A移到B,将最后一个盘子从A移到C,再将前原创 2020-05-09 16:36:43 · 184 阅读 · 0 评论 -
Java数据结构——图的广度优先遍历算法
广度优先遍历的思想广度优先遍历类似树的按层次遍历从图中某个顶点v出发,访问v。 依次访问v的各个未被访问过得邻接点。 分别从这些邻接点出发依次访问他们的邻接点,并使“先被访问的顶点的邻接点”先于“后被访问的顶点的邻接点”被访问。重复步骤3,直至图中所有已被访问的顶点的邻接点都被访问到。import java.util.ArrayList;import java.util.Arrays...原创 2020-05-04 15:03:48 · 446 阅读 · 0 评论 -
Java数据结构——图的深度优先遍历算法
深度优先搜索属于图算法的一种,英文缩写为DFS,其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次深度优先遍历图的方法是,从图中某顶点v出发:(1)访问顶点v;(2)依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问;(3)若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中...原创 2020-05-03 21:11:38 · 359 阅读 · 0 评论 -
Java数据结构——图的创建
import java.util.ArrayList;import java.util.Arrays;public class Graph { private ArrayList<String> vertexList; //存储顶点集合 private int[][] edges; //存储邻接矩阵 private int edgesNum; ...原创 2020-05-02 16:32:20 · 354 阅读 · 0 评论 -
Java数据结构——平衡二叉树
平衡二叉树是在二叉排序树的基础上,对左子树、右子树的高度进行变化,使得二叉树中所有的左子树高度与右子树高度之差小于等于1。平衡二叉树比二叉排序树更方便查找,降低了复杂度。左旋操作:创建新的结点,值为根结点; 将根结点的左子树设为新结点的左子树; 将根结点右子树的左子树设为新结点的右子树; 将根结点的值设为根结点的右子树; 将根结点的右子树设为右子树的右子树; 将根结点的左子树设为...原创 2020-04-25 16:26:22 · 139 阅读 · 0 评论 -
Java数据结构——二叉排序树删除结点
在二叉排序树中删除结点共有三种情况:删除结点为叶子结点、删除结点有一颗子树、删除结点有两颗子树。删除叶子结点操作:找到删除结点的父结点,判断叶子结点为左子结点还是右子结点,parent.left = null或者parent.right = null;删除结点有一颗子树操作:判断要删除结点为父结点的左子结点还是右子结点,并判断删除结点有左子树还是右子树,parent.left = node...原创 2020-04-15 17:39:19 · 615 阅读 · 0 评论 -
Java数据结构——二叉排序树的创建和遍历
二叉排序树:若左子树不空,则左子树上所有结点的值均小于它的根结点的值;若右子树不空,则右子树上所有结点的值均大于它的根结点的值;左、右子树也分别为二叉排序树。二叉排序树的建立,若新加入的结点的值小于根结点的值,则放入左子树;大于跟结点的值,放入右结点。若数组中的内容为:{14, 55, 2, 45, 87, 100, 40, 13},则二叉排序树为:二叉排序树import java....原创 2020-04-12 18:27:16 · 255 阅读 · 0 评论 -
Java数据结构——哈夫曼编码(数据解压)
import java.util.*;public class Main { public static void main(String[] args) { String str = "Do you like a java"; byte[] bytes = str.getBytes(); byte[] huffmanCodesByte...原创 2020-04-08 15:50:44 · 158 阅读 · 0 评论 -
Java数据结构——哈夫曼编码(数据压缩)
import java.util.*;public class Main { public static void main(String[] args) { String str = "This is test data."; byte[] bytes = str.getBytes(); byte[] huffmanCodesByte...原创 2020-03-09 11:22:20 · 461 阅读 · 0 评论 -
Java数据结构——创建哈夫曼树
给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。构建哈夫曼树的过程:1、首先对数组中的数字进行排序,按照从小到大排序;2、排好序之后,将这些数字放入顺序存储结构中,选择最小的两个数字,分别以这两个数为左子节点与右子节点,以这两个数字...原创 2020-02-27 17:05:49 · 534 阅读 · 0 评论 -
Java数据结构——堆排序
堆排序是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序的过程:首先将一个无序的序列进行调整,将其调整为大顶堆或者小顶堆。调整的过程为从左向右、从下至上找到非叶子节点,比较非叶子节点与其左子节点、右子节点的大小,将最大值或者最小值与该节点交换,持续这个过程,直到所有的父节点比子节点大、或...原创 2020-02-25 21:01:26 · 136 阅读 · 0 评论 -
Java数据结构——顺序存储二叉树
二叉树的顺序存储,指的是使用顺序表(数组)存储二叉树。需要注意的是,顺序存储只适用于完全二叉树。换句话说,只有完全二叉树才可以使用顺序表存储。对于将数组转为二叉树,有以下特点:设数组索引为n,左子节点处的索引为2*n+1,右子节点索引为2*n+2,父节点索引为(n-1)/2。public class Main { public static void main(String[...原创 2020-02-21 17:41:16 · 239 阅读 · 0 评论 -
Java数据结构——二叉树删除节点
二叉树删除节点时,分为两种情况,删除节点为叶子节点与非叶子节点。首先判断根节点是否要删除的节点。如果是,则将该二叉树变为空树;否则判断左子节点与右子节点是否要删除的节点。如果是,删除以该节点为根节点的子树,否则进行递归操作,对左子树与右子树进行操作,查找要删除的节点。public class Main { public static void main(String[] ar...原创 2020-02-21 16:57:30 · 766 阅读 · 0 评论 -
Java数据结构——前序中序后序查找
根据前序、中序、后序遍历方法,我们可以通过这种方式来查找节点。查找方法与遍历类似。前序查找先查找根节点,再查找左子节点与右子节点;中序查找先查找左子节点、再查找根节点与右子节点;后序查找先查找左子节点与右子节点,再查找根节点。public class Main { public static void main(String[] args) { Node node...原创 2020-02-20 17:12:54 · 260 阅读 · 0 评论 -
Java数据结构——前序中序后序遍历
在二叉树中,共有三种遍历方法,分别是前序遍历、中序遍历、后序遍历。前序遍历指的是按照根节点--左子节点--右子节点进行遍历;中序遍历指的是按照左子节点--根节点--右子节点进行遍历;后序遍历指的是按照左子节点--右子节点--根节点进行遍历。按照上图构建二叉树后先序遍历结果为:1、2、3、5、4;中序遍历结果为:2、1、5、3、4;后序遍历结果为:2、5、4、3、1publ...原创 2020-02-19 17:20:24 · 392 阅读 · 0 评论 -
Java数据结构——哈希表
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。除留余数法:取关键字被某个不大于哈希表表长m的数p除后所得的余数为散列地址。即 H(key) = key MOD p,p<=m。本实例使用的是除留余数法。...原创 2020-02-19 15:26:08 · 128 阅读 · 0 评论 -
Java数据结构——斐波那契查找
斐波那契搜索就是在二分查找的基础上根据斐波那契数列进行分割的。在斐波那契数列找一个等于略大于查找表中元素个数的数F[n],将原查找表扩展为长度为F[n](如果要补充元素,则补充重复最后一个元素,直到满足F[n]个元素),完成后进行斐波那契分割,即F[n]个元素分割为前半部分F[n-1]个元素,后半部分F[n-2]个元素,找出要查找的元素在那一部分并递归,直到找到。import java....原创 2020-02-17 17:56:27 · 143 阅读 · 0 评论 -
Java数据结构——插值查找
插值查找,有序表的一种查找方式。插值查找是根据查找关键字与查找表中最大最小记录关键字比较后的查找方法。插值查找基于二分查找,将查找点的选择改进为自适应选择,提高查找效率。插值查找公式:mid = left+ (right - left) * (key - arr[left]) / (arr[right] - arr[left])public class Main { publ...原创 2020-02-16 18:11:16 · 167 阅读 · 0 评论 -
Java数据结构——二分查找
二分查找的具体操作为:首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。import java.sql.ClientInfoS...原创 2020-02-15 16:21:17 · 130 阅读 · 0 评论 -
Java数据结构——基数排序
基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。具...原创 2020-02-13 16:57:43 · 110 阅读 · 0 评论 -
Java数据结构——归并排序
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并排序是一种稳定的排序方法。比如初始数组:[3,5,6,7,8,4,1,2]①分成了两个大小相等的子数组:[...原创 2020-02-13 14:12:30 · 113 阅读 · 0 评论 -
Java数据结构——快速排序
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列import java.util.Arrays;import java.util.Date;public class Main { public static void main(S...原创 2020-02-10 17:26:05 · 130 阅读 · 0 评论 -
Java数据结构——希尔排序
希尔排序如图所示,通过逐渐减少增量来实现排序。希尔排序可以通过交换与移位来实现。希尔排序需要找到组数,例如:10个数字第一趟分为10/2=5组,第二趟分为5/2=2组,第三趟分为2/2=1组,直到组数小于或者等于0时停止。交换法:要排序的数字之间通过交换数值来实现排序。移位法:要排序的数字通过移位,将较小的数字插入较大的数字之前,与插入排序类似。import java.u...原创 2020-02-10 15:15:43 · 162 阅读 · 0 评论 -
Java数据结构——插入排序
插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部...原创 2020-02-08 17:22:33 · 309 阅读 · 0 评论 -
Java数据结构——选择排序
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。重复第二步,直到所有元素均排序完毕。import java.util.Arrays;import java.util.Date;public class Main { public static void main(String[] ...原创 2020-02-07 17:48:41 · 100 阅读 · 0 评论 -
Java数据结构——冒泡排序
import java.util.Arrays;import java.util.Date;/*冒泡排序指的是对一组无序的序列进行排序,每相邻两个数据进行比较,进行排序,使整个序列有序化。每次排序都会找到最大的数字放置到最后一位,之后再对无序的序列,前(n-1)个数字进行排序。 */public class Main { public static void main(St...原创 2020-02-07 16:54:26 · 153 阅读 · 0 评论 -
Java数据结构——8皇后问题
public class Queen8 { /* 八皇后问题指的是在8x8的棋盘上,每行均放有一个棋子,使得所有棋子不在同一行、同一列以及同一斜线上 */ int max = 8; //共有8个棋子 static int num = 0; //有几种摆放方法 int[] array = new int[max]; public stat...原创 2020-02-05 15:07:13 · 251 阅读 · 0 评论 -
Java数据结构——逆波兰式计算器
package p1;import java.util.ArrayList;import java.util.List;import java.util.Stack;public class Main { public static void main(String[] args) { //创建要计算的表达式 //(30 + 4) * 5 + ...原创 2019-12-07 09:45:56 · 86 阅读 · 0 评论 -
Java数据结构——栈的实现
package p1;import java.util.Scanner;public class Main { public static void main(String[] args) { arrayStack s1 = new arrayStack(5); Scanner input = new Scanner(System.in); ...原创 2019-12-04 21:32:53 · 315 阅读 · 0 评论 -
Java数据结构——循环链表
package p1;public class Main { public static void main(String[] args) { circleLinkedList l1 = new circleLinkedList(); l1.add(5); l1.show(); l1.del(1, 2, 5); ...原创 2019-12-04 15:20:14 · 150 阅读 · 0 评论 -
Java数据结构——双向链表
package p1;public class Main { public static void main(String[] args) { node n1 = new node(1, "aa"); node n2 = new node(2, "bb"); node n3 = new node(3, "cc"); no...原创 2019-12-03 21:40:54 · 106 阅读 · 0 评论 -
Java数据结构——单链表
package p1;public class Main { public static void main(String[] args) { studentNode st1 = new studentNode(1, "小红", 1101); studentNode st2 = new studentNode(2, "小蓝", 1102); ...原创 2019-12-02 10:23:36 · 302 阅读 · 0 评论 -
Java数据结构——队列与循环队列
1、队列:队列首指针front = -1;队列尾指针rear = -1;队列满的条件:rear == maxSize(队列最大长度)- 1;队列空的条件:rear == front;队列无法重复使用,一旦队首指针后移,之前的空间便无法再次访问,效率低,空间利用率低。2、循环队列:循环队列是在队列的基础上进行了一些改动,使它成为了循环队列。在循环队列中加入了一个空闲空间,...原创 2019-12-01 19:31:13 · 673 阅读 · 0 评论 -
Java数据结构——稀疏矩阵
package p1;public class Main { public static void main(String[] args) { //创建原始数组 int[][] arr1 = new int[5][5]; arr1[1][2] = 1; arr1[3][3] = 2; arr1[4][2]...原创 2019-12-01 09:54:30 · 309 阅读 · 0 评论