数据结构与算法
文章平均质量分 63
使用java实现基本数据结构以及基础算法,参考视频链接如下:https://www.bilibili.com/video/BV1E4411H73v?p=1
顺毛黑起
小白一枚,路漫漫其修远兮,吾将上下而求索
展开
-
(十六)图的基本操作---两种遍历
图的表示方式(存储结构)1.邻接矩阵–数组表示法邻接矩阵是表示图形中顶点之间相邻关系的矩阵,对于 n 个顶点的图而言,矩阵是的 row 和 col 表示的是 1…n个点。用两个数组分别存储数据元素(顶点)的信息和数据元素之间的关系(边或弧)的信息2.邻接表邻接表是图的一种链式存储结构。在邻接表中,对图中的每个顶点建立一个单链表,第i个单链表中的结点表示依附于顶点vi的边(对有向图是以顶点vi为尾的弧)。图的创建(数组)package com.atguigu.graph;import原创 2021-06-03 11:19:12 · 344 阅读 · 1 评论 -
(十五)B-Tree树(B-树)与B+树
B-树B-树是一种平衡的多路查找树。一棵m阶的B-树或者为空树,或者为满足下列特征的m叉树:(1)树中的每个结点至多有m棵子树;(2)若根结点不是叶子结点,则至少有两棵子树;(3)除根结点之外的所有非终端结点至少有不少于m/2棵子树B 树的阶:节点的最多子节点个数。比如 2-3 树的阶是 3,2-3-4 树的阶是 4B-树的搜索,从根结点开始,对结点内的关键字(有序)序列进行二分查找,如果命中则结束,否则进入查询关键字所属范围的儿子结点;重复,直到所对应的儿子指针为空,或已经是叶子结点关键字原创 2021-06-02 16:31:20 · 239 阅读 · 0 评论 -
(十四)平衡二叉树
基本介绍平衡二叉树也叫平衡二叉搜索树(Self-balancing binary search tree)又被称为 AVL 树, 可以保证查询效率较高。具有以下特点:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过 1,并且左右两个子树都是一棵平衡二叉树。...原创 2021-05-31 15:58:37 · 267 阅读 · 0 评论 -
(十三)二叉排序树
基本概念二叉排序树:BST: (Binary Sort(Search) Tree), 对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。特别说明:如果有相同的值,可以将该节点放在左子节点或右子节点创建和遍历package com.atguigu.binarysorttree;public class BinarySortTreeDemo { public static void main(String[] args) {原创 2021-05-30 15:35:12 · 165 阅读 · 0 评论 -
(十二)树--哈夫曼树
基本介绍给定 n 个权值作为 n 个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近概念路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为 1,则从根结点到第 L 层结点的路径长度为 L-1结点的权及带权路径长度:若将树中结点赋给一个有着某种含义的数值,则这个数值原创 2021-05-30 11:13:27 · 274 阅读 · 0 评论 -
(十一)树--堆排序
堆排序基本介绍堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为 O(nlogn),它也是不稳定排序。堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆, 注意 : 没有要求结点的左孩子的值和右孩子的值的大小关系。(大顶堆的特点:arr[i]>=arr[2*i+1] && arr[i]>=arr[2*i+2])每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。(小顶堆的特点:a原创 2021-05-30 09:50:49 · 303 阅读 · 0 评论 -
(十)树的基础部分(二)
顺序存储二叉树从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组。顺序存储二叉树的特点顺序二叉树通常只考虑完全二叉树第 n 个元素的左子节点为 2 * n + 1第 n 个元素的右子节点为 2 * n + 2第 n 个元素的父节点为 (n-1) / 2n : 表示二叉树中的第几个元素(按 0开始编号)顺序存储二叉树遍历需求: 给你一个数组 {1,2,3,4,5,6,7},要求以二叉树前序遍历的方式进行遍历。 前序遍历的结果应当为1,2,4,原创 2021-05-27 19:21:34 · 123 阅读 · 0 评论 -
(十)树的基础部分(一)
为什么需要树这种数据结构数组存储方式的分析优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。(可以快速访问某个元素,通过索引)缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低(不适用于添加和删除元素,数组整体移动)链式存储方式的分析优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,链接到链表中即可,删除效率也很好)。缺点:在进行检索时,效率仍然较低,比如(检索某个值,需要从头节点开始遍历)树存原创 2021-05-25 22:23:36 · 130 阅读 · 0 评论 -
(九)哈希表
基本介绍散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。哈希表在实际中的应用google 上机题有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,名字,住址…),当输入该员工的 id 时, 要求查找到该员工的 所有信息. 要求:不使用数据库,速度越快越好=>哈希表(散列)添加时,原创 2021-05-25 19:20:56 · 167 阅读 · 0 评论 -
(八)查找算法
线性查找线性查找:逐一比对,发现有相同值就返回下标package com.atguigu.search;public class SeqSearch { public static void main(String[] args) { int[] arr={1,9,11,-1,34,89};//没有顺序的数组 int index=seqSearch(arr,11); if (index==-1){ System.out.原创 2021-05-25 16:34:03 · 113 阅读 · 0 评论 -
(七)排序算法(三)
归并排序归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)归并排序图解1.基本思想2.合并相邻有序子序列再来看看治阶段,我们需要将两个已经有序的子序列合并成一个有序序列,比如上图中的最后一次合并,要将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2原创 2021-05-25 14:36:52 · 157 阅读 · 0 评论 -
(七)排序算法(二)
希尔排序简单插入排序存在的问题:当需要插入的数是较小的数时,后移的次数明显增多,对效率有影响.。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。基本思想:希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。希尔排序图解希尔排序时,对有序序列在插入时采用交换法package com.atguigu.sort;import java.u原创 2021-05-25 09:36:58 · 183 阅读 · 0 评论 -
(七)排序算法(一)
排序算法的分类复杂度参考来源https://blog.csdn.net/hiudawn/article/details/80380572冒泡排序(每次都两两比较,然后看是否交换)冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。优化:因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序原创 2021-05-24 16:46:11 · 120 阅读 · 0 评论 -
(六)递归
递归的调用机制简单的说: 递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。递归需要遵守的重要规则执行一个方法时,就创建一个新的受保护的独立空间(栈空间)方法的局部变量是独立的,不会相互影响, 比如 n 变量如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据.递归必须向退出递归的条件逼近,否则就是无限递归,出现 StackOverflowError,死龟了:)当一个方法执行完毕,或者遇到 return,就会返回,遵原创 2021-05-24 15:19:12 · 125 阅读 · 0 评论 -
(五)栈及其应用
数据结构–栈 1.栈是一个先进后出的有序列表 2.栈(stack)限制了只能在线性表的同一端进行操作。允许插入和删除的一端为变化的一端,称为栈顶(top),另一端为固定的一端,称为栈底(bottom)入栈(push)示意图出栈(pop)示意图栈的应用场景数组模拟栈思路分析图package com.atguigu.stack;import java.util.Scanner;public class ArrayStackDemo { public st原创 2021-05-22 09:33:59 · 394 阅读 · 1 评论 -
(四)约瑟夫问题-单向环形链表
约瑟夫问题 问题描述: 设编号为 1,2,… n 的 n 个人围坐一圈,约定编号为 k(1<=k<=n)的人从 1 开始报数,数到m 的那个人出列, 它的下一位又从 1 开始报数,数到 m 的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。思路:用一个不带头结点的循环链表来处理 Josephu 问题:先构成一个有 n 个结点的单循环链表,然后由 k 结点起从 1 开始计数,计到 m 时,对应结点从链表中删除,然后再从被删除结点的下原创 2021-05-17 15:20:35 · 347 阅读 · 1 评论 -
(三)双向链表
单向链表的缺点: 1.单向链表查找的方向只能是一个方向,而双向链表可以镶嵌或者向后查找 2.单向链表不能自我删除,需要借助辅助节点。而双向链表可以自我删除双向链表的插入与删除的示意图在双向链表中插入一个节点时指针的变化情况在双向链表中删除结点时指针的变化情况双向链表的增删改查的实现package com.atheima.linkedlist;public class DoubleLinkedListDemo { public static void m...原创 2021-05-16 16:12:58 · 148 阅读 · 0 评论 -
(二)单链表
线性表的顺序存储的特点是逻辑上相邻的两个元素在物理位置上也相邻。因此可以随机存取表中的任一一个元素。但是这种存储方式存在的缺点是插入或者删除的时候,需要大量移动元素。链式存储可以避免顺序存储的弱点,但同时也失去了顺序表课随机存取的优点。线性链表:链式存储结构–用一组任意的存储单元存储线性表的数据元素(这组讯处单元可以是连续的也可以是不连续的)。链表的基本单元称为节点(node)。节点包括两个域:其中,存储数据元素信息的域称作数据域;存储直接后继存储位置的域称作指针域。用线性链表表示线性表的时候,数据元原创 2021-05-15 22:03:27 · 825 阅读 · 0 评论 -
(一)队列
基本队列队列是一个有序列表,遵循先进先出的原则。从队首出,从队尾进。在代码中定义:maxSize—队列的最大容量。front,队首,随着数据的输出而改变。rear,队尾,随着数据的输入而改变注意,在这里约定front和rear的初始值为-1.1.front变量的含义 front=-1 指向队列头部的前一个位置2.rear变量的含义 :rear=-1 指向队列尾,指向队列尾的数据(即就是队列的最后一个数据)3.当队列满的条件是:rear==maxSizes-14.当队列尾空的条件是 re原创 2021-05-15 21:37:58 · 456 阅读 · 0 评论