数据结构
文章平均质量分 72
UndefinedException
求求你们别卷了!!!
展开
-
数据结构(Java)马踏棋盘算法
程序应由包含以下几部分:1.计算下一步棋怎么走2.只要当前棋子有路可走,就递归地走3.(优化)对某个棋子每个可走的位置(比如上图的 0~7)接下来可走的位置进行比较(下下一步),选择下下一步可走位置最少的位置作为本次移动的位置(贪心算法的思想,尽可能少走冤枉路)测试:...原创 2022-06-03 18:07:07 · 449 阅读 · 0 评论 -
数据结构(Java)最短路径(迪杰斯特拉、弗洛伊德算法)
迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个结点到其他结点的最短路径。 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。 设置出发顶点为v,顶点集合V{v1,v2,vi...},v到V中各顶点的距离构成距离集合Dis,Dis{d1,d2,di...},Dis集合记录着v到图中各顶点的距离(到自身可以看作0,v到vi距离对应为di) 算法的通俗理解: 1.先定义 距离数组 和 已访问数组,并且初始化:与 G 点相关的权值照常填原创 2022-06-03 17:52:22 · 4628 阅读 · 4 评论 -
数据结构(Java)最小生成树(普里姆、克鲁斯卡尔算法)
最小生成树(Minimum Cost Spanning Tree),简称MST。求最小生成树的算法主要是普里姆算法和克鲁斯卡尔算法 1)有胜利乡有7个村庄(A, B, C, D, E, F, G) ,现在需要修路把7个村庄连通prim算法的解析: 比如我们从G点出发,标记已访问,用temp变量存储已访问的顶点, temp.add(G) -> {G} 首先找出与G邻接且二者间权最小并且未被访问的点,也就是 A,原创 2022-06-03 16:44:58 · 2241 阅读 · 0 评论 -
数据结构(Java)贪心算法(分配广播站)
广播台覆盖地区K1"北京", "上海", "天津"K2"广州", "北京", "深圳"K3"成都", "上海", "杭州"K4"上海", "天津"K5"杭州", "大连" 广播台数量n子集总数2ⁿ需要的时间5323.2秒101024102.4秒32429496729613.6年1001.26*100³º 4x10²³年 目前并没有算法可以快速计算得到准备的值, 使用贪婪算法,则可以得到非常接近的解,并且效率高。选择策略上,因为需要覆盖全部地区的最小集合:1.一些静态变量的初始化原创 2022-06-03 15:36:29 · 214 阅读 · 0 评论 -
数据结构(Java)KMP算法
如果用暴力匹配的思路,并假设现在str1匹配到 i 位置,子串str2匹配到 j 位置,则有:三、解决方式-KMP算法1)KMP是一个解决模式串在文本串是否出现过,如果出现过,最早出现的位置的经典算法2)Knuth-Morris-Pratt 字符串查找算法,简称为 “KMP算法”,常用于在一个文本串S内查找一个模式串P 的出现位置,这个算法由Donald Knuth、Vaughan Pratt、James H. Morris三人于1977年联合发表,故取这3人的姓氏命名此算法.3)KMP方原创 2022-06-03 15:13:26 · 118 阅读 · 0 评论 -
数据结构(Java)动态规划(0-1背包问题)
背包问题:有一个背包,容量为4磅 , 现有如下物品物品重量价格Uzi1150098K43000Akm32000 (2) 当w[i]> j 时:v[i][j]=v[i-1][j] // 当准备加入新增商品的容量大于 当前背包的容量时,就直接使用上一个单元格的装入策略 (3) 当j>=w[i]时: v[i][j]=max{v[i-1][j], v[i]+v[i-1][j-w[i]]} // 当 准备加入的新增的商品的容量小于等于当前背包的容量,原创 2022-06-03 14:38:37 · 1622 阅读 · 0 评论 -
数据结构(Java)分治算法(汉诺塔)
分治思想的实践-汉诺塔游戏原创 2022-06-03 14:25:41 · 479 阅读 · 0 评论 -
数据结构(Java)-图-概念与遍历
一、为什么要有图1)前面学了线性表和树2)线性表局限于一个直接前驱和一个直接后继的关系3)树也只能有一个直接前驱也就是父节点4)当我们需要表示多对多的关系时, 我们就用到了图二、图的常用概念1)顶点(vertex)2)边(edge)3)路径4) 无向图5) 有向图6) 带权图三、图的存储结构图的表示方式有两种:二维数组表示(邻接矩阵);链表表示(邻接表)。3.1 邻接矩阵邻接矩阵是表示图形中顶点...原创 2022-05-29 11:18:39 · 168 阅读 · 0 评论 -
数据结构(Java)-树-B树、B+树、B*树的简介
一、二叉树存在的问题二叉树是需要加载到内存的,如果二叉树的节点少,没有什么问题,但是如果二叉树的节点很多(比如1亿), 就存在如下问题:问题1:在构建二叉树时,需要多次进行i/o操作(海量数据存在数据库或文件中),节点海量,构建二叉树时,速度有影响问题2:节点海量,也会造成二叉树的高度很大,会降低操作速度.二、多叉树的概念1)在二叉树中,每个节点有数据项,最多有两个子节点。如果允许每个节点可以有更多的数据项和更多的子节点,就是多叉树(...原创 2022-05-29 10:52:53 · 253 阅读 · 0 评论 -
数据结构(Java)-树-平衡二叉树
一、问题引入你一个数列{1,2,3,4,5,6},要求创建一颗二叉排序树(BST), 并分析问题所在、上边BST 存在的问题分析:1)左子树全部为空,从形式上看,更像一个单链表.2)插入速度没有影响3)查询速度明显降低(因为需要依次比较), 不能发挥BST的优势,因为每次还需要比较左子树,其查询速度比单链表还慢4)解决方案-平衡二叉树(AVL) 二、平衡二叉树的概念1)平衡二叉树也叫平衡二叉搜索树(Self-balancing binary search tre.原创 2022-05-27 22:01:14 · 239 阅读 · 0 评论 -
数据结构(Java)-树-二叉排序树
一、问题引入假如给你一个数列 (7, 3, 10, 12, 5, 1, 9),要求能够高效的完成对数据的查询和添加。解决方法:1.使用数组1)数组未排序, 优点:直接在数组尾添加,速度快。 缺点:查找速度慢.2)数组排序,优点:可以使用二分查找,查找速度快,缺点:为了保证数组有序,在添加新数据时,找到插入位置后,后面的数据需整体移动,速度慢。2.使用链式存储-链表不管链表是否有序,查找速度都慢,添加数据速度比数组快,不需要数据整体移动。3.使用二叉排序树二、二叉排序树..原创 2022-05-27 20:55:33 · 498 阅读 · 1 评论 -
数据结构(Java)-树-哈夫曼树
一、基本介绍1)给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree), 还有的书翻译为霍夫曼树。2)赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近。3)路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-14)结点的权及带权路径长度:若将树中结点赋原创 2022-05-23 12:35:25 · 353 阅读 · 0 评论 -
数据结构(Java)-树-堆排序的实现
一、堆排序基本介绍1)堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏、最好、平均时间复杂度均为O(nlogn),它也是不稳定排序。2)堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆, 注意 : 没有要求结点的左孩子的值和右孩子的值的大小关系。大顶堆特点:arr[i] >= arr[2*i+1] && arr[i] >= arr[2*i+2] // i 对应第几个节点,从0开始3...原创 2022-05-22 17:23:27 · 2232 阅读 · 1 评论 -
数据结构(Java)-树-线索二叉树
一、问题引入将数列 {1, 3, 6, 8, 10, 14 } 构建成一颗二叉树. n+1=7问题分析: 1)当我们对上面的二叉树进行中序遍历时,数列为 {8, 3, 10, 1, 6, 14 }2)但是 6, 8, 10, 14 这几个节点的 左右指针,并没有完全的利用上.3)如果我们希望充分的利用 各个节点的左右指针, 让各个节点可以指向自己的前后节点,怎么办?4)解决方案-线索二叉树二、线索二叉树基本介绍1)n个结点的二叉链表中含有n+1 【公式 2n-(n..原创 2022-05-22 10:45:30 · 95 阅读 · 0 评论 -
数据结构(Java)-树-顺序存储的二叉树
一、顺序存储二叉树的概念从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组。八大排序算法中的堆排序,就会使用到顺序存储二叉树。要求:1)下图的二叉树的结点,要求以数组的方式来存放 arr : [1, 2, 3, 4, 5, 6, 6]2)要求在遍历数组 arr时,仍然可以以前序遍历,中序遍历和后序遍历的方式完成结点的遍历二、顺序存储二叉树的特点1)顺序二叉树通常只考虑完全二叉树2)第n个元素的左子节点为 2 *...原创 2022-05-22 10:22:57 · 162 阅读 · 0 评论 -
数据结构(Java)-树-二叉树入门(遍历、查找、删除)
一、为什么需要树这种数据结构1)数组存储方式的分析优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低2)链式存储方式的分析优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,链接到链表中即可, 删除效率也很好)。缺点:在进行检索时,效率仍然较低,比如(检索某个值,需要从头节点开始遍历)...原创 2022-05-21 13:38:09 · 303 阅读 · 0 评论 -
数据结构(Java)-哈希表
介绍散列表散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。代码演示1.员工类class Emp { public int id; public String name; //next初始为null public Emp next; ...原创 2022-05-20 17:36:00 · 60 阅读 · 0 评论 -
数据结构(Java)-查找算法(顺序、二分、插值)
在java中,我们常用的查找有四种: 1) 顺序(线性)查找 2) 二分查找/折半查找 3) 插值查找 4) 斐波那契查找一、线性查找(略)//线性查找 傻瓜式查找 public static int linerSearch(Integer[] arr,Integer findVal){ for(int i=0;i<arr.length;i++){ count++; if(arr[i].equa...原创 2022-05-20 14:11:40 · 283 阅读 · 0 评论 -
数据结构(Java)-排序算法-基数排序(带负数)
基数排序(桶排序)介绍:1)基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”(一般是10个,表示0~9)中,达到排序的作用2)基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定排序法3)基数排序(Radix Sort)是桶排序的扩展4)基数排序是1887年赫尔曼·何乐礼发明的。它是这样实现的:将整数按位数切割原创 2022-05-15 20:17:56 · 675 阅读 · 4 评论 -
数据结构(Java)-排序算法-归并排序
归并排序介绍归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。合并的细节:需要将两个已经有序的子序列合并成一个有序序列,比如上图中的最后一次合并,要将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,...原创 2022-05-15 18:50:55 · 190 阅读 · 0 评论 -
数据结构(Java)-排序算法-快速排序
介绍快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列代码思路我们要先设定一个基准策略,可以是序列的第一个、中间、最后一个数。我觉得选取第一个数作为基准比较容易理解,也容易实现。 1.首先有一个大前提,左边界 < 右边界,(并非左...原创 2022-05-15 16:06:25 · 776 阅读 · 0 评论 -
数据结构(Java)-排序算法-希尔排序
希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。基本思想希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。代码思路与演示一、交换式希尔排序 1.设定步长,也就是最外层循环,每次循环gap减半 ...原创 2022-05-15 12:30:02 · 277 阅读 · 0 评论 -
数据结构(Java)-排序算法-插入排序
插入排序法思想:插入排序的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它依次与有序表元素进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。代码思路:1.开始时有序表中只包含第1个元素,无序表中包含有n-1个元素2.把待插入的元素先取出来(后面涉及到移动元素,会占用它的位置),同时使用一个指针,每次循环开始时指向有序表最后的元素3.查找合适的位置并插入新元素原创 2022-05-14 17:13:46 · 3859 阅读 · 0 评论 -
数据结构(Java)-排序算法-选择排序
选择排序:选择排序也是一种简单的排序方法。它的基本思想是:对于总共n个元素的数组arr:第一次从arr[0]~arr[n-1]中选取最小值,与arr[0]交换,第二次从arr[1]~arr[n-1]中选取最小值,与arr[1]交换,第三次从arr[2]~arr[n-1]中选取最小值,与arr[2]交换,…,第i次从arr[i-1]~arr[n-1]中选取最小值,与arr[i-1]交换,…, ...原创 2022-05-14 16:06:21 · 4637 阅读 · 0 评论 -
数据结构(Java)-排序算法-冒泡排序
基本介绍冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志flag判断元素是否进行过交换。从而减少不必要的比较。思路演示原始数组:3, 9, -1, 10, 20第一趟排序(1...原创 2022-05-14 15:20:11 · 5299 阅读 · 0 评论 -
数据结构(Java)-排序算法与时间复杂度的介绍
一、排序算法的介绍排序也称排序算法,排序是将一组数据,依指定的顺序进行排列的过程。排序的分类:1) 内部排序:指将需要处理的所有数据都加载到内部存储器中进行排序。2) 外部排序法:数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。二、算法的时间复杂度1.时间频度一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中...原创 2022-05-14 14:02:01 · 655 阅读 · 0 评论 -
数据结构(Java)-八皇后问题(递归、回溯)
八皇后问题介绍八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。八皇后问题算法思路分析1) 第一个皇后先放第一行第一列2) 第二个皇后放在第二行第一列、然后判断是否OK[即判断是冲突], 如果不OK,继续放在第二列、第三列、依次把所有列都放完,找到一个合适3) 继续第三个皇后,还是第一列、第二列……原创 2022-05-14 12:31:59 · 718 阅读 · 0 评论 -
数据结构(Java)-迷宫回溯游走问题(递归)
递归的用途:1)各种数学问题如:八皇后问题 , 汉诺塔, 阶乘问题, 迷宫问题, 球和篮子的问题(google编程大赛)2)各种算法中也会使用到递归,比如快排,归并排序,二分查找,分治算法等.3)将用栈解决的问题-->递归代码比较简洁递归需要遵守的重要规则:1)执行一个方法时,就创建一个新的受保护的独立空间(栈空间)2)方法的局部变量是独立的,不会相互影响, 比如n变量3)如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据.4...原创 2022-05-13 21:08:04 · 436 阅读 · 1 评论 -
数据结构(Java)-栈实现逆波兰(后缀表达式)计算器
前缀表达式(略)中缀表达式1)中缀表达式就是常见的运算表达式,如(3+4)×5-62)中缀表达式的求值是我们人最熟悉的,但是对计算机来说却不好操作,因此,在计算结果时,往往会将中缀表达式转成其它表达式来操作(一般转成后缀表达式.)后缀表达式1)后缀表达式又称逆波兰表达式,与前缀表达式相似,只是运算符位于操作数之后2)中举例说明: (3+4)×5-6 对应的后缀表达式就是 3 4 + 5 × 6 – 正常的表达式 逆波兰(后缀)表达式.原创 2022-05-13 16:31:12 · 196 阅读 · 0 评论 -
数据结构(Java)-栈
什么是栈?1)栈是一个先入后出(FILO-First In Last Out)的有序列表。2)栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。3)根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除图示入栈出栈:栈的应用场景:1)子程序的调用:在跳..原创 2022-05-06 21:48:27 · 87 阅读 · 0 评论 -
数据结构(Java)-循环单链表(以约瑟夫问题为例)
Josephu(约瑟夫、约瑟夫环) 问题设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。例如:n = 5 , 即有5个人 k = 1, 从第一个人开始报数m = 2, 数2下此时结果为2->4->1->5->3...原创 2022-05-01 17:36:22 · 1262 阅读 · 0 评论 -
数据结构(Java)-双向链表
单链表的一些缺点:1)单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找。2)单向链表不能自我删除,需要靠辅助节点 ,而双向链表,则可以自我删除,所以前面我们单链表删除节点时总是找到temp,temp是待删除节点的前一个节点分析双向链表的遍历,添加,修改,删除的操作思路:1) 遍历 和 单链表一样,只是可以向前,也可以向后查找。节点需要增加一个pre属性2) 添加 (默认添加到双向链表的最后)(1) 先找到双向...原创 2022-05-01 17:07:43 · 208 阅读 · 0 评论 -
数据结构(Java)-单链表
1)链表是以节点的方式来存储,是链式存储2)每个节点包含 data 域, next 域:指向下一个节点.3)如图:发现链表的各个节点不一定是连续存储.4)链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定创建单链表的思路:1. 先创建一个head 头节点, 作用就是表示单链表的头2. 后面我们每添加一个节点,就直接加入到链表的最后按照编号顺序添加节点的思路:...原创 2022-04-29 19:07:25 · 1928 阅读 · 0 评论 -
数据结构(Java)- 队列、环形队列(循环队列)
队列是一个有序列表,可以用数组或是链表来实现。遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出数组模拟队列队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图, 其中 maxSize 是该队列的最大容量。因为队列的输出、输入是分别从前后端来处理,因此需要两个变量 front及 rear分别记录队列前后端的下标,front 会随着数据输出而改变,而 rear则是随着数据输入而改变,如图所示:思路分...原创 2022-04-28 18:31:26 · 1133 阅读 · 0 评论 -
数据结构(Java)-稀疏数组
问题引入: 因为该二维数组的很多值是默认值0, 因此记录了很多没有意义的数据,所以我们可以把普通的二维数组转为稀疏数组,可以减少内存占用。 概念: 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。 稀疏数组的处理方法是: 1.记录数组一共有几行几列,有多少个不同的值 2.把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模 /*以象棋为例,创建原始二维数组5*5,设0表示没有棋子,1...原创 2022-04-28 15:43:38 · 68 阅读 · 0 评论