![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 61
Kowloonm
为者常成,行者常至。
展开
-
数据结构笔记_49 贪心算法
一、简介二、实例思路一、穷举法思路二、贪心算法思路图解:allAreas 存放需要覆盖的所有地区,selects集合存放每一次比较后的最优解。首先经过key从K1比较到K5,发现K1的后面没有比K1 大的,所以把K1放入selects 集合中,并在allAreas 中删除掉K1所覆盖的城市,准备下一次的比较。在去掉第一轮中的城市后,开始第二轮比较,发现K2覆盖2个城市,是最多的,于是将maxKey指向K2,并将K2加入selects集合,在allAreas中删除K2包含的城市。拿原创 2021-03-12 23:57:51 · 264 阅读 · 0 评论 -
数据结构笔记_48 KMP算法
一、介绍传送门: 参考资料二、实例:1、分析思路图解:2、总结KMP步骤:先得到子串的部分匹配表(最长公共前后缀)再使用部分匹配表完成KMP匹配三、代码实操1、得到子串的部分匹配表再往上面填写,即可得到子串的部分匹配表(最长公共前后缀)。关于下面这行代码的由来:如下:首先,len - 1 ,然后 它这个位置上的数字,就是新的len这里的 1 代表匹配到的最长公共串的长度为1.2、使用部分匹配表完成KMP匹配测试:输出:完整代码:p原创 2021-03-12 00:10:13 · 316 阅读 · 1 评论 -
数据结构笔记_47 暴力匹配算法
先看一个暴力匹配法:2)的注释:i = i - (j-1),即从i 之前 匹配成功位置 的 下一个位置 开始匹配。暴力匹配示意图:暴力匹配算法虽然比较笨,但也不失为字符串匹配问题的一种解决方案。可以拿来跟后面的KMP算法作比较。代码+输出:package com.huey.kmp;public class ViolenceMatch { public static void main(String[] args) { // 测试暴力匹配 String str1 = "烦恼不.原创 2021-03-11 13:03:18 · 247 阅读 · 2 评论 -
数据结构笔记_46 动态规划(01背包问题)
一、简介:下面是算法的介绍:先看一个实例:背包问题二、实例图解:三、代码1、首先设置基础属性,并将表初始化。2、核心代码:输出:3、完整代码:package com.huey.dynamic;public class KnapsackProblem { public static void main(String[] args) { int[] w = { 1, 4, 3 };// 物品的重量 int[] val = { 1500, 3000, 2000 };//原创 2021-03-11 12:29:04 · 221 阅读 · 2 评论 -
数据结构笔记_45 分治算法(汉诺塔等)
一、简介二、基本步骤三、算法设计模式四、分治算法实例:汉诺塔演示:将盘子移动至C塔1、只有一个盘子时A到C,一步到位即可。2、有两个盘子时三步走。将A塔上面的所有盘移动到B塔;将A塔下面的盘子移动到C塔;把B塔的盘子移动到C塔。第一步: 将A塔上面的所有盘移动到B塔;第二步:将A塔下面的盘子移动到C塔;第三步:把B塔的盘子移动到C塔。3、有三个盘子时一样的思路:将A塔上面的所有盘移动到B塔;将A塔下面的盘子移动到C塔;把B塔的盘子移动到C塔。原创 2021-03-10 15:56:40 · 155 阅读 · 0 评论 -
数据结构笔记_44 二分查找(非递归)
二分查找算法(非递归)介绍:需要注意的是, 只有有序的数列才可以使用此算法。优点:非递归的方式,易于理解,且效率不错,节省开辟栈空间的开销了。代码实现:例:现有数组{ 1, 3, 8, 10, 11, 67, 100 },要求实现二分查找(非递归)测试:完整代码package com.huey.binarysearchnorecursion;public class BinarySearchNoRecur { public static void main(String[]原创 2021-03-10 13:47:50 · 143 阅读 · 0 评论 -
数据结构笔记_43 DFS和BFS的比较
二者差异:1、思想上:深度是每找到一个就从这一个开始,广度是始终从i开始向后找,直到以i开始没有相邻的。2、代码上:深度用递归,广度用队列。前面由于结点过少,看不出DFS和BFS在输出结果上的差别,通过下面这个例子看出来其差异。测试代码:输出:...原创 2021-03-10 00:14:46 · 145 阅读 · 0 评论 -
数据结构笔记_42 图的广度优先遍历(BFS)
lsdkfj原创 2021-03-09 23:59:59 · 181 阅读 · 0 评论 -
数据结构笔记_41 图的深度优先遍历(DFS)
一、何为图的遍历?二、DFS步骤:一条路走到黑,如果没走通,就回到最后一个节点的上一个节点,然后在这个节点换一条路再走。原创 2021-03-09 11:30:15 · 184 阅读 · 0 评论 -
数据结构笔记_40 图的创建
如题,上例子:思路分析:存储顶点String 使用Array List保存矩阵 使用 int [][] edges代码:package com.huey.graph;import java.util.ArrayList;import java.util.Arrays;public class Graph { private ArrayList<String> vertexList;// 存储顶点的集合 private int[][] edges;// 存储图对应的原创 2021-03-08 22:57:56 · 159 阅读 · 0 评论 -
数据结构笔记_39 图的基本介绍
一、为什么需要图?答:前面学习了线性表和树,线性表只有一个直接前驱和一个直接后继;树也只有一个直接前驱也就是父节点。当我们需要表示多对多关系时,就需要使用图了。二、图的简介三、图的常用概念四、图的表示方式图有两种表示方式:二维数组表示(邻接矩阵)、链表表示(邻接表)...原创 2021-03-08 21:40:42 · 98 阅读 · 0 评论 -
数据结构笔记_38 多路查找树(B树、B+树、B*树)
二叉树存在的问题分析:正是由于二叉树存在的这些问题,前人设计出了多叉树来解决相应的问题。多叉树:B树的基本介绍:一个结点中,存放着若干个数据项。2-3树基本介绍: 2-3树的创建,仍然遵守二叉排序树(BST)的规则。2-3树的案例:核心在于:构建2-3树的时候, 每添加一个结点时,都要时刻满足2-3树的要求。分布构建2-3树图示:下面的数组中,标红的字体,涉及到一个调整的问题。...原创 2021-03-08 21:10:05 · 126 阅读 · 0 评论 -
数据结构笔记_37 平衡二叉树(左、右旋转,双旋转)
简介:需要注意的是,平衡二叉树是建立在二叉排序树的基础之上的。是一种对二叉排序树的优化,以免出现下面类似的问题:平衡二叉树(AVL),其中 AV和L是发明者的名字首字母。在二叉排序树中,当右子树的高度比左子树高的时候,我们需要进行左旋转。左旋转的目的:降低右子树的高度。左旋转图解:????????????????????????????????????????????????????????????????????????????????????????????????????????原创 2021-03-07 22:04:40 · 574 阅读 · 2 评论 -
数据结构笔记_36 二叉排序树(删除)
图解删除二叉排序树节点的三种情况:第三种情况中,targetNode 右子树最小的节点刚好满足:大于左子树的所有结点 ,同时小于右子树其他剩余节点。类似的,左子树的最大结点也满足。下面代码取用找右子树的最小结点。1、第一种情况:删除叶子结点查找要删除的结点(Node类中):查找要删除结点的父节点(Node类中):这里写的时候出现的bug:其一是,判断当前节点是否是要删除的父节点时,第二个判断语句没有加括号,且this.right.value写成this.value简单在BinarySort原创 2021-03-07 13:26:36 · 317 阅读 · 1 评论 -
数据结构笔记_35 二叉排序树(创建、遍历)
二叉排序树简介:对于二叉排序树来说,中序遍历恰巧就是升序。代码:1、创建Node结点在Node结点中的add方法,无需考虑根节点是否为空,待会在BinarySortTree 类中的add方法中判断一下即可。同理,中序遍历的方法亦是如此。2、创建二叉排序树测试:...原创 2021-03-07 09:16:33 · 217 阅读 · 1 评论 -
数据结构笔记_34 赫夫曼编码压缩、解压文件
前言:自己压缩的文件哭着也要解压出来~~????弹幕有个hxd说:“压缩了老婆,解压不了了。”好家伙,好家伙,好家伙。前面学习了通过赫夫曼编码对一个字符串进行编码和解码,下面来完成对文件的压缩和解压。具体要求:对一张图片文件进行无损压缩。这里使用到了IO的知识:以对象流的形式写入,以对象流的形式读出。思路:Created with Raphaël 2.2.0读取文件得到哈夫曼编码表完成压缩~源码:测试:src 是本人照片,src2 是 这样的,全白背景中的笔画。可以看出,只有原创 2021-03-06 23:18:33 · 395 阅读 · 0 评论 -
数据结构笔记_33 赫夫曼解码
补码:正数的补码是其本身,负数的补码是其取反加一。为何补码可以简化计算机的设计。对于人脑而言,做du加减题时,第一反应zhi就是根据符dao号位,来选择对真值区域zhuan的加减。但是计算机而言,像加减乘除这类最最基础也是应用得最频繁的基本运算,在物理逻辑的设计上一定要设计的尽量简单。如果让计算机也先判断符号位再分别做加或者减的运算的话,会使得计算机的电路设计变得较为复杂。人类发明了将符号位也参与进运算的方法来。对shu于计算机而言,不管是加法还是减法,都统一用加法来做运算,可以使得计算机的设计变得原创 2021-03-06 21:19:20 · 142 阅读 · 4 评论 -
数据结构笔记_32 生成哈夫曼编码表、压缩后的字节数组
思路:将赫夫曼编码表存放在Map<Byte,String> 形式:32->01,97->100,100->11000等等。[形式]在生成赫夫曼编码表时,需要去拼接路径,定义一个StringBuilder 存储某个叶子结点的路径。代码:测试:...原创 2021-03-06 15:36:26 · 309 阅读 · 1 评论 -
数据结构笔记_31 哈夫曼编码(含创建哈夫曼树)
一、霍夫曼编码基本介绍:二、通信领域中几种信息的处理方式:1.定长编码:原理是将字符对应的ASCLL码转换成二进制后传输信息。缺点:需要存储大量的二进制数据太浪费时间,空间了。比如,空格的ASCLL码值为32,转换成二进制,如图:2.变长编码:缺点:匹配的时候,存在多义性。例如,10110。既可以分解成1,0,110也可以分解成10,110亦可以是101,10.3.哈夫曼编码:注意,这个赫夫曼树根据排序方法不同,也可能不太一样,排序方法的不同是啥意思?比如说有可能会出现原创 2021-03-05 13:19:47 · 633 阅读 · 3 评论 -
数据结构笔记_30 哈夫曼树(Huffman Tree)
一、Huffman Tree 简介给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二又树为最优二叉树,也称为哈夫曼树。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。二、常见概念:路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1结点的权:若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权原创 2021-03-03 21:55:18 · 332 阅读 · 1 评论 -
数据结构笔记_29 堆排序
一、简介:堆排序是利用【堆】这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为 O(nlogn),它也是不稳定排序。堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆。注意:没有要求结点的左孩子的值和右孩子的值的大小关系。堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆。注意:没有要求结点的左孩子的值和右孩子的值的大小关系。每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。1、大原创 2021-03-03 14:07:07 · 208 阅读 · 0 评论 -
数据结构笔记_28 线索二叉树的遍历
先试试看原先的遍历方法:测试:出现死循环。因为原先的8号节点的左右指针是空的,这也是结束遍历的条件。但在线索化之后,这个结束条件就不成立了。所以,退不出去,就进入了死循环。综上:当线索化二叉树后,不能再使用原来的遍历方法。分析:由于线索化之后,各个节点指向有变化 ,因此原来的遍历方式不能使用,这时需要使用新的方式遍历线索化二叉树,各个节点可以通过线性方式遍历,因此无需使用递归方式,这样也提高了遍历的效率。遍历的次序应和中序遍历保持一致。接上文:会有疑问,例如:拿什么来区分节点指向的是左原创 2021-03-02 00:32:30 · 204 阅读 · 0 评论 -
数据结构笔记_27 线索二叉树的创建
先看一个问题:一、线索二叉树基本介绍:1)的注解:上面那个公式,可以理解成:未利用的指针 = 所有的可利用指针 - 已经利用的指针图中,8有个指针指向了3,因为是中序遍历,所以3是8的后继节点。3)的注解:以中序遍历为例,有如下数列:3的前驱节点就是8,而8没有前驱节点。4)的注解:类似的,中序遍历中,8的后继节点是3,6没有后继节点。二、思路分析:流程如下:图中8没有前驱节点,所以只有一个指向,即右指针指向后继节点3;图中3的左右指针已经充分使用了,所以不需要进行操原创 2021-03-01 22:16:54 · 288 阅读 · 2 评论 -
数据结构笔记_26 顺序存储二叉树
一、顺序二叉树的概念从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组。二、特点:n:表示二叉树中的第几个元素。(和数组下标原则保持一致,从0开始,见上图)顺序二叉树通常只考虑完全二叉树第 n 个元素的左子节点为 2 * n + 1第 n 个元素的右子节点为 2 * n + 2第 n 个元素的父节点为 (n - 1) / 2...原创 2021-02-28 11:06:34 · 126 阅读 · 0 评论 -
数据结构笔记_25 二叉树删除结点
本节任务:如果删除的节点是叶子节点,则删除该节点如果删除的节点是非叶子节点,则删除该子树测试删除5号叶子节点和3号子树思路图解:规定:如果删除的节点是叶子节点,则删除该节点。如果删除的节点是非叶子节点,则删除该子树。 把判断root的逻辑写在BinaryTree二叉树的删除方法里,然后递归的逻辑写在HeroNode节点的删除方法里。思路:首先处理: 考虑如果树是空树,和如果只有一个root节点,则等价于将二叉树置空。 public void delNode(int no)原创 2021-02-28 10:25:20 · 228 阅读 · 0 评论 -
数据结构笔记_24 二叉树的前序、中序、后序查找
这一节,完成以下任务:编写前序、中序、后序查找的方法。使用三种方式,查找no为5的结点。分析每种查找方式,分别比较了几次。一、思路与前面遍历的思路类似,直接上思路图解:以 5号节点为例,不同顺序的查找方式,比较次数是不一样的。前序需要4次比较才能找到5号节点,中序3次,后序2次。二、代码1、三种查找底层代码// 前序遍历查找 /** * @param no 查找no * @return 找到就返回该Node,否则返回null */ public HeroNode p原创 2021-02-28 00:58:27 · 147 阅读 · 0 评论 -
数据结构笔记_23 二叉树的前序、中序、后序遍历(含重写toSring,this相关)
概念:前序遍历:先输出父节点,再遍历左子树和右子树。中序遍历:先遍历左子树,再输出父节点,再遍历右子树。后序遍历:先遍历左子树,再遍历右子树,最后输出父节点。小结:看输出父节点的顺序,就确定是前序,中序还是后序。遍历步骤:前序:根左右中序:左根右后序:左右根代码先创建一个 HeroNode 节点,里面包含基本属性、构造方法、各种遍历方法的底层代码。再定义 BinaryTree 二叉树,在二叉树中调用相关的接口。相当于节点提供具体的底层实现方法,树来进行调用。和前面的哈希表类原创 2021-02-27 22:50:44 · 246 阅读 · 0 评论 -
数据结构笔记_22 二叉树的概念和常用术语
节点:每个小圆圈就是一个节点,其实就是对象,有的人称之为节点对象。根节点:就是A,它上面没有父节点了。父节点:A是B、C的父节点。B、C、D同理,它们都有子节点。子节点:B、C是子节点,它们都有一个父节点A。而D、E、F、G、H同理。叶子节点:没有子节点的节点,例如:H、E、F、G.节点的权(节点的值):例如一个Emp雇员的编号为6,6就是它的权。路径:从root 节点找到该节点的路线。例如:H的路线就是ABDH。层:我们把在同一个级别的,或者说一个层面的,归结于同一层。A位于第1层、B、..原创 2021-02-27 12:41:13 · 538 阅读 · 0 评论 -
数据结构笔记汇总
学习的是尚硅谷韩顺平老师的课程。现将总结的笔记链接,整理如下:000.稀疏数组 001.数组模拟队列 002.数组模拟环形队列 003.单链表(插入、修改、删除) 004.单链表(新浪、腾讯、百度面试题) 005.双链表 006.环形链表 007.栈 008.前缀、中缀、后缀(逆波兰表达式) 009.中缀转后缀 010.递归(应用场景、机制) 011.递归(走迷宫、八皇后) 012.时间频度、(时间、空间)复杂度 013.常见的排序算法 014.交换排序(冒泡、快速) 01原创 2021-02-27 12:06:45 · 317 阅读 · 0 评论 -
数据结构笔记_21 数组、链表、树存储方式分析
一、数组:集合ArrayList 的底层是数组。Arraylist 的底层操作机制源码分析二、链表三、树(以二叉排序树为例)简言之,树 集成了数组、链表的优点。原创 2021-02-27 11:47:29 · 121 阅读 · 0 评论 -
数据结构笔记_20 哈希表
先看一个google公司的上机题:一、简介: 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。二、为何需要哈希表? Jav原创 2021-02-26 23:50:14 · 135 阅读 · 0 评论 -
数据结构笔记_19 查找算法(含包装类、装箱)
常用的查找算法有四种:1、线性(顺序)查找遍历数组+比较的思想。package com.huey.search;public class SeqSearch { public static void main(String[] args) { int[] arr = { 2, 43, -23, 233, 94, 929, 82 }; int index = seqSearch(arr, -23); if (index == -1) { System.out.println("原创 2021-02-26 00:05:35 · 216 阅读 · 0 评论 -
数据结构笔记_18 基数排序
一、简介基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog®m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。二、原理逐层从低位到高位,把数据每个位数小到大排。三、例子:将53,3,542,748,14,214按升原创 2021-02-20 16:35:01 · 148 阅读 · 0 评论 -
数据结构笔记_17 归并排序
一、简介归并排序(Merge Sort)是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。二、基本思想先“分”再“治”。先将数组分割,再进行有序合并。以最后一次“治”为例:图1:i 指向4,j 指向1,temp为临时数组。步骤1:先把左右两边(有序)的数据,按照规则填充到temp 数组。直原创 2021-02-19 18:25:53 · 206 阅读 · 0 评论 -
数据结构笔记_16 插入排序(直接插入排序、希尔排序)
一、直接插入排序1、介绍插入式排序属于内部排序法,是对于待排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。可以比方成打牌,将抓到的牌按一定的顺序,插入到合适的位置。2、思想插入排序(Insertion Sorting)的基本思想是:把n 个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含 n-1 个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。为了方原创 2021-02-17 17:01:06 · 193 阅读 · 0 评论 -
数据结构笔记_15 选择排序(简单选择排序、堆排序)
一、简单选择排序1、思想从待排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。2、思路举个栗子:以第一轮排序举例:先假定第一个数字:101 是最小的数。通过一个循环遍历找出后面的元素中最小的数字。第一次比较,101>34,更新一下最小数。将最小数 min置为34、最小值索引 minIndex置为2;第二次比较,34<119,不更新。第三次比较,34>1,更新一下最小数。将最小数 min置为1、最小值索引 minIndex置为4;再将101和最小数原创 2021-02-15 16:39:35 · 137 阅读 · 0 评论 -
数据结构笔记_14 交换排序(冒泡、快速)
一、冒泡排序(Bubble Sorting)基本思想是:重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。演示冒泡过程:以第一趟为例,有5个位置。(1)先比较1,2位置上的元素:3<9,符合我们原创 2021-02-14 12:41:58 · 262 阅读 · 0 评论 -
数据结构笔记_13 常见的排序算法
一、排序算法的介绍排序就是将一组数据,依指定的顺序进行排列的过程。二、排序的分类1、内部排序指将需要处理的所有数据,都加载到内部存储器(内存)中进行排序。2、外部排序数据量过大,无法全部加载到内存中,需要借助外部存储(文件等)进行排序。三、常见的排序算法...原创 2021-02-14 12:20:42 · 131 阅读 · 0 评论 -
数据结构笔记_12 时间频度、(时间、空间)复杂度
一、时间频度定义:一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中语句的执行次数称为语句频度或时间频度,记为T(n).实例:计算1~100的和。注:第一种方式,T(n)=n+1,其中+1,是最后一次对条件判断,不成立然后退出循环。特点:1、忽略常数项结论:1)2n + 20 和 2n 随着 n 变大,执行曲线无限接近,20可以省略。2)3n + 10 和 3n 随着 n 变大,执行曲线无限接近,10可以省略。2、忽略低次项结论:原创 2021-02-11 16:17:12 · 1050 阅读 · 0 评论 -
数据结构笔记_11 递归(走迷宫、八皇后)
现在有一个封闭的迷宫,四周都围绕着砖块,还有两个挡板。小球在迷宫内左上角,现要求小球到右下角说明:map 表示地图i,j 表示从地图的哪个位置出发如果小球能到 map[6][5] 位置,则说明通路已找到约定:当 map[i][j] 为0 ,表示该点没有走过当 map[i][j] 为1 ,表示墙当 map[i][j] 为2 ,表示通路可以走当 map[i][j] 为3 ,表示该点已经走过,但是走不通策略:走迷宫时的方向选择为:下 -> 右 -> 上 -> 左原创 2021-02-11 13:12:18 · 99 阅读 · 0 评论