![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
编程界——周大神
这个作者很懒,什么都没留下…
展开
-
数据结构与算法之顺序存储二叉树
顺序存储二叉树顺序存储二叉树的概念基本说明从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组,看右面的示意图顺序存储二叉树的特点:1)顺序二叉树通常只考虑完全二叉树2)第n个元素的左子节点为 2 * n + 13)第n个元素的右子节点为 2 * n + 24)第n个元素的父节点为 (n-1) / 2需求:给你一个数组 {1,2,3,4,5,6,7},要求以二叉树前序遍历的方式进行遍历。 前序遍历的结果应当为 1,2,4,5,3,6原创 2021-01-19 15:11:13 · 200 阅读 · 0 评论 -
数据结构与算法之二叉树删除
二叉树删除二叉树-删除节点要求如果删除的节点是叶子节点,则删除该节点如果删除的节点是非叶子节点,则删除该子树.测试,删除掉 5号叶子节点 和 3号子树思路分析代码实现public class Treedemo { public static void main(String[] args) { HeroNode root = new HeroNode(1, "宋江"); HeroNode node2 = new HeroNode(2, "吴用");原创 2021-01-18 18:32:33 · 405 阅读 · 0 评论 -
数据结构与算法之二叉树查找
二叉树查找二叉树-查找指定节点要求1)请编写前序查找,中序查找和后序查找的方法。2)并分别使用三种查找方式,查找 heroNO = 5 的节点3)并分析各种查找方式,分别比较了多少次思路分析图解代码实现public class Treedemo { public static void main(String[] args) { HeroNode root = new HeroNode(1, "宋江"); HeroNode node2 = new原创 2021-01-18 16:12:44 · 235 阅读 · 1 评论 -
数据结构与算法之二叉树遍历
二叉树遍历遍历前序遍历: 先输出父节点,再遍历左子树和右子树中序遍历: 先遍历左子树,再输出父节点,再遍历右子树后序遍历: 先遍历左子树,再遍历右子树,最后输出父节点小结: 看输出父节点的顺序,就确定是前序,中序还是后序二叉树遍历应用实例代码实现public class Treedemo { public static void main(String[] args) { HeroNode root = new HeroNode(1, "宋江");原创 2021-01-17 22:23:09 · 95 阅读 · 0 评论 -
数据结构与算法之二叉树概念
二叉树概念树示意图和常用术语树的常用术语(结合示意图理解):1)节点2)根节点3)父节点4)子节点5)叶子节点 (没有子节点的节点)6)节点的权(节点值)7)路径(从root节点找到该节点的路线)8)层9)子树10)树的高度(最大层数)11)森林 :多颗子树构成森林二叉树的概念1)树有很多种,每个节点最多只能有两个子节点的一种形式称为二叉树。2)二叉树的子节点分为左节点和右节点。3)如果该二叉树的所有叶子节点都在最后一层,并且结点总数= 2^n -1 , n 为层数,则原创 2021-01-17 20:16:05 · 76 阅读 · 0 评论 -
数据结构与算法之存储分析
数组、链表、树的存储分析数组存储方式的分析优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低链式存储方式的分析优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,链接到链表中即可, 删除效率也很好)。缺点:在进行检索时,效率仍然较低,比如(检索某个值,需要从头节点开始遍历)树存储方式的分析能提高数据存储,读取的效率, 比如利用 二叉排序树(Binary S原创 2021-01-11 23:29:30 · 285 阅读 · 0 评论 -
数据结构与算法之哈希表
哈希表介绍散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。应用看一个实际需求,google公司的一个上机题:有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,住址…),当输入该员工的id时,要求查找到该员工的 所有信息.要求: 不使用数据库,尽量节省内存,速度越快越好=>哈希表(散原创 2021-01-11 23:18:18 · 123 阅读 · 0 评论 -
数据结构与算法之排序
排序算法总结常用的排序算法对比相关术语解释:1)稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;2)不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面;3)内排序:所有排序操作都在内存中完成;4)外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行;5)时间复杂度: 一个算法执行所耗费的时间。6)空间复杂度:运行完一个程序所需内存的大小。7)n: 数据规模8)k: “桶”的个数9)In-place: 不占用额外内存原创 2021-01-06 16:40:28 · 47 阅读 · 0 评论 -
数据结构与算法之基数排序
基数排序介绍1)基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用2)基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法3)基数排序(Radix Sort)是桶排序的扩展4)基数排序是1887年赫尔曼·何乐礼发明的。它是这样实现的:将整数按位数切割成不同的数字,然后按每个位数分别比较。基本思想1)将原创 2021-01-05 22:21:41 · 107 阅读 · 0 评论 -
数据结构与算法之排序
快速排序介绍快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列示意图代码实现public class QuickSortdemo { public static void main(String[] args) { int[] arr={57,-1,0,75,-原创 2021-01-04 00:44:42 · 127 阅读 · 0 评论 -
数据结构与算法之排序
希尔排序简单插入排序存在的问题我们看简单的插入排序可能存在的问题.数组 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}结论: 当需要插入的数是较小的数时,后移的次数明显增多,对效率有影响.介绍希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排原创 2021-01-03 17:38:23 · 306 阅读 · 0 评论 -
数据结构与算法之空间复杂度
空间复杂度基本介绍1)类似于时间复杂度的讨论,一个算法的空间复杂度(Space Complexity)定义为该算法所耗费的存储空间,它也是问题规模n的函数。2)空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度。有的算法需要占用的临时工作单元数与解决问题的规模n有关,它随着n的增大而增大,当n较大时,将占用较多的存储单元,例如快速排序和归并排序算法就属于这种情况3)在做算法分析时,主要讨论的是时间复杂度。从用户使用体验上看,更看重的程序执行的速度。一些缓原创 2021-01-02 18:06:52 · 180 阅读 · 0 评论 -
数据结构与算法之时间复杂度
算法的时间复杂度度量一个程序(算法)执行时间的两种方法1、事后统计的方法这种方法可行, 但是有两个问题:一是要想对设计的算法的运行性能进行评测,需要实际运行该程序;二是所得时间的统计量依赖于计算机的硬件、软件等环境因素, 这种方式,要在同一台计算机的相同状态下运行,才能比较那个算法速度更快。2、事前估算的方法通过分析某个算法的时间复杂度来判断哪个算法更优.举例说明–>忽略常数项举例说明–>忽略低次项举例说明–>忽略系数时间复杂度1)一般情况下,算法中的基本操原创 2021-01-02 18:02:22 · 305 阅读 · 0 评论 -
数据结构与算法之栈
中缀表达式转后缀表达式需求大家看到,后缀表达式适合计算式进行运算,但是人却不太容易写出来,尤其是表达式很长的情况下,因此在开发中,我们需要将 中缀表达式转成后缀表达式。算法思路分析1、初始化两个栈:运算符栈s1和储存中间结果的栈s2;2、从左至右扫描中缀表达式;3、遇到操作数时,将其压s2;4、遇到运算符时,比较其与s1栈顶运算符的优先级:(1).如果s1为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈;(2).否则,若优先级比栈顶运算符的高,也将运算符压入s1;(3).否则,将s原创 2020-12-30 16:35:05 · 93 阅读 · 0 评论 -
数据结构与算法之栈
逆波兰计算器要求1.输入一个逆波兰表达式(后缀表达式),使用栈(Stack), 计算其结果2.支持小括号和多位数整数。思路分析代码实现public class Calculator_back { public static void main(String[] args) { String expresion="3 4 + 5 * 6 -"; //将表达式存入数组中去 List<String> list = Calculat原创 2020-12-29 21:57:08 · 49 阅读 · 0 评论 -
数据结构与算法之栈
三种表达式前缀表达式求值从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 和 次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果例如(3+4)×5-6 对应的前缀表达式就是 - × + 3 4 5 6 , 针对前缀表达式求值步骤如下:1.从右至左扫描,将6、5、4、3压入堆栈2.遇到+运算符,因此弹出3和4(3为栈顶元素,4为次顶元素),3.计算出3+4的值,得7,再将7入栈4.接下来是原创 2020-12-29 20:00:23 · 57 阅读 · 0 评论 -
数据结构与算法之栈
中缀表达式实现多位数的计算代码实现:public class Calculatordemo { public static void main(String[] args) { //数栈 ArrayStack2 numStack = new ArrayStack2(50); //符号栈 ArrayStack2 operStack = new ArrayStack2(50); String expresion="70*原创 2020-12-29 16:26:47 · 53 阅读 · 0 评论 -
数据结构与算法之栈
栈实现综合计算器(中缀表达式)1.使用栈来实现综合计算器2.思路分析3.代码实现(先实现一位运算)//主函数public class Calculatordemo { public static void main(String[] args) { //数栈 ArrayStack2 numStack = new ArrayStack2(50); //符号栈 ArrayStack2 operStack = new Array原创 2020-12-29 16:01:10 · 65 阅读 · 0 评论 -
数据结构与算法之栈
栈栈的实际需求请输入一个表达式计算式:[722-5+1-5+3-3] 点击计算【如下图】请问: 计算机底层是如何运算得到结果的? 注意不是简单的把算式列出运算,因为我们看这个算式 7 * 2 * 2 - 5, 但是计算机怎么理解这个算式的(对计算机而言,它接收到的就是一个字符串),我们讨论的是这个问题。-> 栈栈的介绍1、栈的英文为(stack)2、栈是一个先入后出(FILO-First In Last Out)的有序列表。3、栈(stack)是限制线性表中元素的插入和删除只能在线性原创 2020-12-11 11:24:52 · 81 阅读 · 0 评论 -
数据结构与算法之环形链表
环形链表单向环形链表介绍Josephu问题Josephu 问题为:设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。n=5,即有5个人k=1,从第一个·人开始报数m=2,数2下提示用一个不带头结点的循环链表来处理Josephu 问题:先构成一个有n个结点的单循环链表,然后由k结点起从1开始计数,计到m时,对原创 2020-12-10 20:01:55 · 97 阅读 · 0 评论 -
数据结构与算法之双链表
双链表使用带head头的双向链表实现 –水浒英雄排行榜管理单向链表的缺点分析:1、单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找。2、单向链表不能自我删除,需要靠辅助节点 ,而双向链表,则可以自我删除,所以前面我们单链表删除时节点,总是找到temp,temp是待删除节点的前一个节点.分析双向链表的遍历,添加,删除,修改操作1、遍历和单链表一样,只是可以向前,也可以向后查找2、添加(默认添加到双链表的最后这个节点)1)先找到双向链表的最后这个节点2)temp.next=原创 2020-12-08 16:43:32 · 74 阅读 · 0 评论 -
数据结构与算法之单链表面试题
单链表面试题1、求单链表的有效节点的个数 //求单链表的有效节点的个数 public int getlength(HeroNode node){ int length=0; HeroNode cur=node.next; while (cur!=null){ length++; cur=cur.next; } return length; }2、查找单链表中原创 2020-12-07 20:50:21 · 100 阅读 · 0 评论 -
数据结构与算法之链表
链表链表介绍链表是有序的列表,但是它在内存中是存储如下1、链表是以节点的方式来存储,是链式存储2、每个节点包含 data 域, next 域:指向下一个节点.3、如上图:发现链表的各个节点不一定是连续存储.4、链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定单链表(带头结点) 逻辑结构示意图如下单链表的应用实例使用带head头的单向链表实现 –水浒英雄排行榜管理1、完成对英雄人物的增删改查操作2、第一种方法在添加英雄时,直接添加到链表的尾部3、第二种方式在添加英雄时,原创 2020-12-04 21:35:46 · 65 阅读 · 0 评论 -
数据结构与算法之队列
队列队列介绍1.队列是一个有序列表,可以用数组或是链表来实现。2.遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出3.示意图:数组模拟队列当我们将数据存入队列时称为”addQueue”,addQueue 的处理需要有两个步骤:思路分析1.将尾指针往后移:rear+1 , 当front == rear 【空】2.若尾指针 rear 小于队列的最大下标 maxSize-1,则将数据存入 rear所指的数组元素中,否则无法存入数据。 rear == maxSize - 1[原创 2020-12-02 19:37:36 · 88 阅读 · 0 评论