数据结构与算法学习
文章平均质量分 58
一切程序的灵魂!!!!
可爱发
Love music and code.
展开
-
Day24堆排序
一、什么是堆排序简介基本思想二、堆排序步骤演示步骤一 构造初始堆。将给定无序序列构造成一个大顶堆(一般升序采用大顶堆,降序采用小顶堆)。.假设给定无序序列结构如下.此时我们从最后一个非叶子结点开始(叶结点自然不用调整,第一个非叶子结点 arr.length/2-1=5/2-1=1,也就是下面的6结点),从左至右,从下至上进行调整。.找到第二个非叶节点4,由于[4,9,8]中9元素最大,4和9交换。这时,交换导致了子根[4,5,6]结构混乱,继续调整,[4,原创 2022-01-26 21:45:46 · 115 阅读 · 0 评论 -
Day23线索化二叉树
一、什么是线索化二叉树?基本介绍1)n个结点的二叉链表中含有n+1 【公式 2n-(n-1)=n+1】 个空指针域。利用二叉链表中的空指针域,存放指向该结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索")2)这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树(Threaded BinaryTree)。根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种3)一个结点的前一个结点,称为前驱结点4)一个结点的后一个结点,称为后继原创 2022-01-24 22:43:18 · 226 阅读 · 0 评论 -
Day22顺序存储二叉树
一、什么是顺序存储二叉树基本说明特点其实说白了就是把数组里的数据以二叉树的形式遍历出来(前序、中序、后序)二、代码实现顺序存储二叉树要求代码实现package com.fafa.tree;/** * 顺序存储二叉树(数组转成二叉树) * * @author Sire * @version 1.0 * @date 2022-01-23 20:37 */public class ArrBinaryTreeDemo { public static原创 2022-01-24 22:42:33 · 359 阅读 · 0 评论 -
Day21二叉树快速入门学习(Java)
一、为什么要使用树这种数据结构1)数组存储方式的分析优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低 [示意图]2)链式存储方式的分析优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,链接到链表中即可, 删除效率也很好)。缺点:在进行检索时,效率仍然较低,比如(检索某个值,需要从头节点开始遍历) 【示意图】3)树存储方式的分析能提高数据存储,读取的效率, 比原创 2022-01-23 14:39:55 · 557 阅读 · 0 评论 -
Day20哈希表
一、什么是哈希表二、需求场景google公司的一个上机题:有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,名字,住址…),当输入该员工的id时**,**要求查找到该员工的所有信息.要求不使用数据库,速度越快越好 => 哈希表(散列)添加时,保证按照id从低到高插入 [课后思考:如果id不是从 **低到高插入,但要求各条链表仍是从低到高,怎么解决?]使用链表来实现哈希表, 该链表不带表头[即: 链表的第一个结点就存放雇员信息]2)思路分析并画原创 2022-01-21 22:40:49 · 1129 阅读 · 0 评论 -
Day19四种查找算法(线性、二分、插值、斐波那契)
一、线性查找思路很简单,就是遍历一遍然后从中比对代码实现package com.fafa.search;import java.util.ArrayList;import java.util.List;/** * 线性查找 * * @author Sire * @version 1.0 * @date 2022-01-18 14:14 */public class SeqSearch { public static void main(String[] arg原创 2022-01-20 23:23:48 · 513 阅读 · 0 评论 -
Day18基数排序
一、什么是基数排序1)基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用2)基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法3)基数排序(Radix Sort)是**桶排序**的扩展4)基数排序是1887年赫尔曼·何乐礼发明的。它是这样实现的:将整数按位数切割成不同的数字,然后按每个位数分别比较。二原创 2022-01-17 21:14:46 · 157 阅读 · 3 评论 -
Day17归并排序
一、什么是归并排序归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治**(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治**(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。二、归并排序思想示意图一共需要合并 nums.length - 1次,带入到此图中就是 7 次就拿 4 5 7 8这组和 1 2 3 6这组的合并举例说明合并过程(也就是最后一次合并)三、代码实现pa原创 2022-01-15 22:04:41 · 234 阅读 · 0 评论 -
Day16快速排序及其优化
一、什么是快速排序快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列效率上来讲,一般情况下是和希尔排序差不多的(结尾有对比图,快速排序更适合数据量大的情况下使用,越大越能体现其优势),当然快排的快是以空间换时间得来的(递归)。二、快速排序示意图三、代码实现package com.fa原创 2022-01-15 15:33:01 · 126 阅读 · 0 评论 -
Day15希尔排序及其优化
一、为什么要学希尔排序因为简单插入排序存在一些问题我们看简单的插入排序可能存在的问题.数组 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年提出的一种排原创 2022-01-14 16:25:21 · 347 阅读 · 0 评论 -
Day14插入排序及其小优化
一、插入排序简介介绍插入排序属于内部排序算法,是对预排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。排序思想插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。思路图二、具体实现及优化(小优化)流程演示本来的顺原创 2022-01-13 14:16:56 · 326 阅读 · 0 评论 -
Day13选择排序优化
选择排序简介选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。选择排序思路分析图如何优化选择排序思路建议在一定数据量的情况下查看效果,比如排序80000个随机数据,会比未优化的快很多(效果很明显)因为减少了很多没必要的置换,未优化前的选择,其实和冒泡很相似(只不过冒泡是先把后面的排好,选择是先把前面的排好)选择排序(已优化)* 思路:* 1、首先,先假定最小值和最小值的下标索引* 2、然后进行寻找,如果找到比最小值还要小的,原创 2022-01-12 21:20:25 · 246 阅读 · 0 评论 -
Day12冒泡排序优化
简写原创 2022-01-11 22:17:11 · 362 阅读 · 0 评论 -
Day11如何衡量算法的时间复杂度和空间复杂度
一、排序算法的介绍简介排序也称排序算法 (Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程。排序的分类:内部排序:指将需要处理的所有数据都加载到内部存储器中进行排序。外部排序法:数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。常见的排序算法分类(见下图):二、算法的时间复杂度1、度量一个程序(算法)执行时间的两种方法1)事后统计的方法这种方法可行, 但是有两个问题:一是要想对设计的算法的运行性能进行评测,需要实际运行该程序原创 2022-01-11 18:27:51 · 3605 阅读 · 0 评论 -
Day10八皇后问题
一、八皇后问题简介八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。二、八皇后问题算法思路分析(回溯算法)1)第一个皇后先放第一行第一列2)第二个皇后放在第二行第一列、然后判断是否OK, 如果不OK,继续放在第二列、第三列、依次把所有列都放完,找到一个合适3)继续第三个皇后,还是第一列、第二列……直到第8个皇后也原创 2022-01-09 20:08:57 · 457 阅读 · 0 评论 -
Day09递归介绍和简单迷宫问题
一、递归(Recursion)1、递归简介简单的说: 递归就是方法自己调用自己,每次调用时传入不同的变量**.**递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。2、递归可以解决什么问题1)各种数学问题如: 8皇后问题 , 汉诺塔, 阶乘问题, 迷宫问题, 球和篮子的问题(google编程大赛)2)各种算法中也会使用到递归,比如快排,归并排序,二分查找,分治算法等.3)将用栈解决的问题–>递归代码比较简洁3、递归需要遵守的重要规则1)执行一个方法时,就创建一个新的受保护的独立空原创 2022-01-08 21:45:58 · 361 阅读 · 0 评论 -
Day08栈的简单应用之计算器(逆波兰表达式)
一、中缀表达式实现计算器1、思路通过一个index值(索引),来遍历我们的表达式如果发现是数字,就直接进数栈如果是运算符,就直接进符号栈如果当前符号栈为空,则直接入栈如果符号栈里有操作符,需要进行判断,如果栈内操作符优先级大于或者等于当前操作符, 则pop出符号栈有一个元素,同时pop出数字栈内两个元素,三个元素进行运算,结果返回数字栈,当前操作符入字符栈,反之,当前操作符则直接进入符号栈表达式扫描完毕(index >= expression.length()),就按照顺序从数栈和符号原创 2022-01-07 15:12:09 · 560 阅读 · 0 评论 -
Day07栈的快速入门(数组加单链表)
一、栈的简介1、栈的英文为(stack)2、栈是一个先入后出(FILO-First In Last Out)的有序列表。3、栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。4、根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除5、出栈(pop)和入栈(push)的概念(如图所示原创 2022-01-05 17:32:49 · 209 阅读 · 0 评论 -
Day06单向环形链表和约瑟夫问题
一、单向环形链表1、单向环形链表的应用场景Josephu(约瑟夫、约瑟夫环)问题Josephu 问题为:设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。提示:用一个不带头结点的循环链表来处理Josephu 问题:先构成一个有n个结点的单循环链表,然后由k结点起从1开始计数,计到m时,对应结点从链表中删除,然后再从被删除结原创 2022-01-05 15:03:42 · 492 阅读 · 0 评论 -
Day05双链表学习
一、双向链表应用实例使用带head头的双向链表实现——水浒英雄排行榜管理单向链表的缺点分析:单向链表,查找的方向只能是一个方向,而双向链表可以是向前或者向后查找。单向链表不可以自我删除,需要考辅助节点,而双向链表,则可以自我删除,所以我们单链表删除节点,总是需要找到temp,temp是待删除节点的前一个节点(认真体会)。示意图辅助理解删除分析 双向链表的遍历,添加,修改,删除的操作思路===》代码实现遍历 方和 单链表一样,只是可以向前,也可以向后查找添加 (默认添加到双向链表的原创 2022-01-05 15:03:07 · 76 阅读 · 0 评论 -
Day04单链表面试题
单链表常见面试题(新浪、百度、腾讯)1、求单链表中有效节点的个数(很简单)实现代码/** * 常见面试题1:获取单链表的有效元素个数 * 思路:直接遍历(但是要排除头结点) */public static int getValidNode(HeroNode head){ int num = 0; // 链表为空 if (head.next == null){ return num; } // 排除头结点原创 2022-01-01 22:08:25 · 429 阅读 · 0 评论 -
Day03单链表学习
单链表一、链表介绍链表是有序的列表,但是它在内存中是存储如下小结:1)链表是以节点的方式来存储,是链式存储2)每个节点包含 data 域, next 域:指向下一个节点.3)如图:发现链表的各个节点不一定是连续存储.4)链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定二、单链表2.1、单链表介绍单链表(带头结点) 逻辑结构示意图如下2.2、单链表的应用实例使用带head头的单向链表实现 –水浒英雄排行榜管理1)完成对英雄人物的增删改查操作, 注: **删除和修改,查原创 2021-12-30 22:22:44 · 521 阅读 · 0 评论 -
Day02数组队列和环形数组队列
队列一、应用场景银行排队案例二、队列介绍队列是一个有序列表,可用 数组 或者 链表 来实现遵循先入先出的原则,即:先存入队列的数据,要先取出。后存入的要后取出示意图三、实现思路数组模拟队列队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图, 其中 maxSize 是该队列的最大容量。因为队列的输出、输入是分别从前后端来处理,因此需要两个变量 front及 rear分别记录队列前后端**的下标,front 会随着数据输出而改变,而原创 2021-12-29 22:22:43 · 246 阅读 · 0 评论 -
Day01稀疏数组学习
稀疏数组写在前面相关代码工程链接:点击这里一、实际需求二、基本介绍当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存改数组!稀疏数组的处理方式:1)记录数组一共有几行几列,有多少个不同的值2)把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模三、应用实例1)使用稀疏数组,来保留类似前面的二维数组(棋盘、地图等等)2)把稀疏数组存盘,并且可以从新恢复原来的二维数组数3)整体思路分析4)代码实现SparseArry.javap原创 2021-12-28 22:15:36 · 259 阅读 · 0 评论