![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
我的数据结构
xiaoshiguang3
这个作者很懒,什么都没留下…
展开
-
图的基本介绍以及图的深度优先和广度优先遍历
图的基本介绍以及图的深度优先和广度优先遍历1.图基本介绍为什么要有图前面我们学了线性表和树线性表局限于一个直接前驱和一个直接后继的关系树也只能有一个直接前驱也就是父节点当我们需要表示多对多的关系时, 这里我们就用到了图2. 图基本介绍图的举例说明图是一种数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边。 结点也可以称为顶点。如图图的常用概念顶点(vertex)边(edge)路径无向图(右图)无向图: 顶点之间的连接没有方向,比如A-B,即可以原创 2020-07-22 07:14:37 · 281 阅读 · 0 评论 -
平衡二叉树(AVL树)的实现
平衡二叉树(AVL树)1.为什么要用平衡二叉树(AVL树)看一个案例(说明二叉排序树可能的问题)给你一个数列{1,2,3,4,5,6},要求创建一颗二叉排序树(BST), 并分析问题所在.左边BST 存在的问题分析:左子树全部为空,从形式上看,更像一个单链表.插入速度没有影响查询速度明显降低(因为需要依次比较), 不能发挥BST的优势,因为每次还需要比较左子树,其查询速度比单链表还慢解决方案-平衡二叉树(AVL)2.平衡二叉树基本介绍平衡二叉树也叫平衡二叉搜索树(Self-ba原创 2020-07-19 17:11:16 · 719 阅读 · 0 评论 -
二叉排序树(BST)
二叉排序树(BST (Binary Sort(Search) Tree))1.基本介绍对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。特别说明:如果有相同的值,可以将该节点放在左子节点或右子节点。比如针对前面的数据 (7, 3, 10, 12, 5, 1, 9) ,对应的二叉排序树为:2.二叉排序树创建和遍历3.二叉排序树的删除二叉排序树的删除情况比较复杂,有下面三种情况需要考虑删除叶子节点 (比如:2, 5, 9, 12)删除只有一原创 2020-07-15 22:43:21 · 177 阅读 · 0 评论 -
赫夫曼树
赫夫曼树1.基本介绍(1) 给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree), 还有的书翻译为霍夫曼树。(2) 赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近。2.赫夫曼树几个重要概念和举例说明路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1结转载 2020-07-11 16:56:56 · 146 阅读 · 0 评论 -
详解堆排序
堆排序1.堆排序基本介绍(1) 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。(2) 堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆, 注意 : 没有要求结点的左孩子的值和右孩子的值的大小关系。(3) 每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆(4) 大顶堆举例说明:我们对堆中的结点按层进行编号,映射到数组中就是下面这个样子:大顶堆特点:arr[原创 2020-07-10 07:56:25 · 2321 阅读 · 1 评论 -
线索化二叉树以及遍历线索化二叉树
线索化二叉树以及遍历线索化二叉树1.线索二叉树基本介绍n个结点的二叉链表中含有n+1 【公式 2n-(n-1)=n+1】 个空指针域。利用二叉链表中的空指针域,存放指向该结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索")这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树(Threaded BinaryTree)。根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种一个结点的前一个结点,称为前驱结点一个结点的后一个结点,称为原创 2020-07-08 22:02:08 · 366 阅读 · 0 评论 -
顺序存储二叉树
顺序存储二叉树1.顺序存储二叉树的概念二叉树存储在一个数组中,通过存储元素的下标反映元素之间的父子关系。从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组。2.顺序存储二叉树的特点:顺序二叉树通常只考虑完全二叉树第n个元素的左子节点为 2 * n + 1第n个元素的右子节点为 2 * n + 2第n个元素的父节点为 (n-1) / 2n : 表示二叉树中的第几个元素(按0开始编号如上示)3.顺序存储二叉树应用实例八大排序算法中的原创 2020-07-06 22:49:55 · 370 阅读 · 0 评论 -
树的基本介绍和二叉树(BinaryTree)的介绍以及二叉树前中后序遍历
树的基本介绍和二叉树(BinaryTree)的介绍以及二叉树前中后序遍历1.树(tree)为什么需要树这种数据结构(1)数组存储方式的分析优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低(2)链式存储方式的分析优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,链接到链表中即可, 删除效率也很好)。缺点:在进行检索时,效率仍然较低,比如(检索某个值,需要从头节点转载 2020-07-04 18:00:54 · 168 阅读 · 0 评论 -
哈希表(Hash table)
哈希表(Hash table)1.哈希表的基本介绍哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。2.google公司的一个上机题:有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,名字,住址…),当输入该员工的id时,要求查找到该员工的 所有信息.要求:不使用数据库,速度越快越好=原创 2020-07-03 07:40:10 · 993 阅读 · 0 评论 -
斐波那契(黄金分割法)查找算法(FibonacciSearch)
斐波那契(黄金分割法)查找算法(FibonacciSearch)1.基本介绍1)黄金分割点是指把一条线段分割为两部分,使其中一部分与全长之比等于另一部分与这部分之比。取其前三位数字的近似值是0.618。由于按此比例设计的造型十分美丽,因此称为黄金分割,也称为中外比。这是一个神奇的数字,会带来意向不大的效果。2)斐波那契数列 {1, 1, 2, 3, 5, 8, 13, 21, 34, 55 } 发现斐波那契数列的两个相邻数 的比例,无限接近 黄金分割值0.6182.斐波那契(黄金分割法)原理原创 2020-07-01 21:55:39 · 1299 阅读 · 1 评论 -
插值查找算法
插值查找算法1.插值查找原理介绍:1)插值查找算法类似于二分查找,不同的是插值查找每次从自适应mid处开始查找。2)将折半查找中的求mid 索引的公式 , low 表示左边索引left, high表示右边索引right.key 就是前面我们讲的 findVal。3)int mid = low + (high - low) * (key - arr[low]) / (arr[high] - arr[low]) ;插值索引对应的代码公式:int mid = left + (right – lef原创 2020-06-27 08:07:30 · 810 阅读 · 0 评论 -
二分查找算法
二分查找算法1.思路分析首先确定该数组的中间的下标: mid = (left + right) / 2然后让需要查找的数 findVal 和 arr[mid] 比较2.1 findVal > arr[mid] , 说明你要查找的数在mid 的右边, 因此需要递归的向右查找2.2 findVal < arr[mid], 说明你要查找的数在mid 的左边, 因此需要递归的向左查找2.3 findVal == arr[mid] 说明找到,就返回什么时候我们需要结束递归?3.1原创 2020-06-27 00:32:02 · 126 阅读 · 0 评论 -
线性查找
线性查找1.java中常见的查找算法在java中,我们常用的查找有四种:1) 顺序(线性)查找2) 二分查找/折半查找3) 插值查找4) 斐波那契查找2.线性查找算法public class SeqSearch { public static void main(String[] args) { int arr[] = { 1, 9, 11, -1, 34, 89 };// int index = seqSearch(arr, -11);原创 2020-06-26 20:36:59 · 234 阅读 · 0 评论 -
基数排序(radix sort)
基数排序(radix sort)1.基本介绍1)基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用。2)基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法。3)基数排序(Radix Sort)是桶排序的扩展。4)基数排序是1887年赫尔曼·何乐礼发明的。它是这样实现的:将整数按位数切割成不同的数字,然原创 2020-06-26 18:25:49 · 4111 阅读 · 0 评论 -
归并排序(MERGE-SORT)
归并排序(MERGE-SORT)1.基本介绍归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。2.归并排序思想示意图1、基本思想:可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式去实现)。分阶段可以理解为就是递归拆分子序列的过程2、原创 2020-06-26 10:33:58 · 575 阅读 · 0 评论 -
希尔排序(SheelSort)
希尔排序(SheelSort)1.简单插入排序存在的问题我们看简单的插入排序可能存在的问题.数组 arr = {2,3,4,5,6,1} 这时需要插入的数 1(最小), 这样的过程是:{2,3,4,5,6,6}{2,3,4,5,5,6}{2,3,4,4,5,6}{2,3,3,4,5,6}{2,2,3,4,5,6}{1,2,3,4,5,6}结论: 当需要插入的数是较小的数时,后移的次数明显增多,对效率有影响.2.基本介绍希尔排序是希尔(Donald Shell)于1959年提出的原创 2020-06-21 17:11:40 · 201 阅读 · 0 评论 -
插入排序(Insertion Sorting)
插入排序(Insertion Sorting)1.基本介绍插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。2.思路分析图代码:import原创 2020-06-21 11:58:02 · 319 阅读 · 0 评论 -
选择排序SelectSort
选择排序SelectSort1.基本介绍选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。选择排序(select sorting)也是一种简单的排序方法。它的基本思想是:第一次从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原创 2020-06-21 01:11:49 · 305 阅读 · 0 评论 -
冒泡排序BubbleSort及其优化
冒泡排序BubbleSort1.基本介绍冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。优化:因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志flag判断元素是否进行过交换。从而减少不必要的比较。(这里说的优化,可以在冒泡排序写好后,在进行)2.演示冒泡过程的例子原创 2020-06-20 23:02:05 · 464 阅读 · 0 评论 -
算法的时间复杂度
算法的时间复杂度1.算法的时间复杂度度量一个程序(算法)执行时间的两种方法:1)事后统计的方法这种方法可行, 但是有两个问题:一是要想对设计的算法的运行性能进行评测,需要实际运行该程序;二是所得时间的统计量依赖于计算机的硬件、软件等环境因素, 这种方式,要在同一台计算机的相同状态下运行,才能比较那个算法速度更快。2)事前估算的方法通过分析某个算法的时间复杂度来判断哪个算法更优.时间频度时间频度:一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个原创 2020-06-14 17:03:34 · 2984 阅读 · 1 评论 -
递归,以及迷宫问题和八皇后问题
递归问题1.什么是递归简单的说: 递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。//递归的小案例:public class RecursionTest { public static void main(String[] args) { test(4); //输出n = 2 n = 3 n = 4 System.out.println(factorial(3)); //输出 6原创 2020-06-13 21:12:46 · 219 阅读 · 0 评论 -
数组模拟栈的实现以及通过中缀转后缀表示式实现简单计算器
栈1.基本介绍栈(stack)是一个 先入后出(FILO-First In Last Out) 的有序列表。栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除。2.栈的应用场景子程序的调用:在跳往子程序前,会先将下个指令的地原创 2020-06-11 20:48:15 · 149 阅读 · 0 评论 -
Josepfu问题的解决
Josepfu问题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解决思路:使用单向环形链表解决构造单向环形链表的思路:先创建一个节原创 2020-06-11 09:03:30 · 234 阅读 · 0 评论 -
双链表的介绍及基本操作
双向链表1.基本介绍1)单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找2)单向链表不能自我删除,需要靠辅助节点 ,而双向链表,则可以自我删除2.增删改查操作(有头结点)遍历:单链表一样,只是可以向前,也可以向后查找 //遍历双向链表 public void list(){ //判断链表是否为空 if(head.next == null){ return; } //因为头结原创 2020-06-10 11:45:13 · 513 阅读 · 0 评论 -
单链表的介绍及基础操作
单链表1.单链表介绍链表是有序的列表,但是它在内存中是存储如下链表是以节点的方式来存储,是链式存储每个节点包含 data 域, next 域:指向下一个节点.如图:发现链表的各个节点不一定是连续存储.链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定单链表(带头结点) 逻辑结构示意图如下2.增删改查操作(有头结点)增:不考虑编号时:1. 找到链表最后的结点2. 将这个结点的next指向这个新添加的结点 //添加结点到单向链表 //思路:当不考虑编原创 2020-06-10 11:43:46 · 313 阅读 · 0 评论 -
队列和环形队列的实现
队列1、基本介绍队列是一个有序列表,可以用数组或是链表来实现。遵循 先入先出(FIFO) 的原则。即:先存入队列的数据,要先取出。后存入的要后取出。2、数组模拟队列队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图, 其中 maxSize 是该队列的最大容量。因为队列的输出、输入是分别从前后端来处理,因此需要两个变量 front及 rear分别记录队列前后端的下标,front 会随着数据输出而改变,而 rear则是随着数据输入而改变,如图所示(在这里fron原创 2020-06-09 17:11:21 · 426 阅读 · 0 评论 -
稀疏矩阵介绍及实现
稀疏矩阵1、基本介绍当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。2、稀疏数组的处理方法1)记录数组一共有几行几列,有多少个不同的值(假设有sum个,则稀疏矩阵有sum+1行,3列)2)把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模3、举例说明[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZLXHkQe4-1591629865757)(en-resource://database/525:1)]4、原创 2020-06-08 23:30:19 · 3734 阅读 · 4 评论