![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
文章平均质量分 87
atwdy
https://leetcode.cn/u/atwdy/
展开
-
【数据结构】——二叉树详解
二叉树(Binary Tree)是由n个结点构成的有限集(n≥0),n=0时为空树,n>0时为非空树。对于非空树TTT有且仅有一个根结点;除根结点外的其余结点又可分为两个不相交的子集TLT_LTL和TRT_RTR,分别称为TTT的左子树和右子树,且TLT_LTL和TRT_RTR本身又都是二叉树。很明显该定义属于递归定义,所以有关二叉树的操作使用递归往往更容易理解和实现。从定义也可以看出二叉树与一般树的区别主要是两点,一是每个结点的度最多为2;原创 2021-07-28 21:00:55 · 50271 阅读 · 6 评论 -
布隆过滤器
布隆过滤器,可以简单的理解为布隆过滤器=一个位数组+一系列哈希函数,位数组就是数组中的值只能为0或1,每个值只占用一个bit的数组,初始时位数组中的值全部置为0。布隆过滤器适合用来在大数据量的场景下判断一个元素是否存在,判断的依据是:对该元素分别使用每个hash函数,根据计算出来的hash值检查位数组中对应位置的值为0还是1,如果所有hash值位置的值都为1,则说明这个元素可能存在;如果有任一hash值位置为0,则说明这个元素一定不存在。可以这样判断的原因是,布隆过滤器在保存数据时,是将待保存的元素分别放到原创 2022-06-27 18:13:00 · 293 阅读 · 0 评论 -
【数据结构】——哈夫曼树及哈夫曼编码
一、哈夫曼树(一)什么是哈夫曼树(二)哈夫曼树的构建(三)哈夫曼树的几个特点(四)java代码构建哈夫曼树二、哈夫曼树拓展:构建最优k叉树三、哈夫曼编码一、哈夫曼树(一)什么是哈夫曼树哈夫曼树也叫最优树,那它具体优在什么地方?要弄懂这个问题我觉得先搞明白什么是判定树。引用百度百科的原话是:决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法。后面说的是啥,我也没看懂,不过不重要,重要.原创 2021-07-29 10:18:05 · 11125 阅读 · 3 评论 -
【数据结构】——图的最短路径算法补充(贝尔曼-福特+SPFA)
另两种图的最短路径算法,迪杰斯特拉&弗洛伊德:https://blog.csdn.net/namewdy/article/details/106330604为了方便以上面链接中的无向图为例,同样求顶点A与顶点E的最短路径长度及最短路径。1.贝尔曼-福特(Bellman-Ford)Bellman-Ford算法和Dijkstra算法一样,都是图的单源最短路径算法,也都是通过松弛操作求解。从Dijkstra中知道,对一条边(u, v)松弛操作,其实就是测试是否可以通过 u,对迄今找到的 v 的最短路原创 2021-07-29 10:15:48 · 307 阅读 · 0 评论 -
【数据结构】——图的最短路径算法(迪杰斯特拉+弗洛伊德)
两种算法的动态演示:视频地址另两种图的最短路径算法,贝尔曼-福特&SPFA:https://blog.csdn.net/namewdy/article/details/106330691下面代码都以此图为例,求顶点A与顶点E的最短路径长度及最短路径。(最短路径:A B G F C I E,最短路径长度24)1.迪杰斯特拉(Dijkstra)迪杰斯特拉,也有人叫作狄克斯特拉,该算法是贪心思想的运用。具体表现在:如果源点A到终点B的距离最短,那么这条路径上的其它顶点到源点A的距离也是最短的。原创 2021-07-29 10:14:35 · 2791 阅读 · 0 评论 -
【数据结构】——图的深度优先搜索和广度优先搜索
关于邻接矩阵和邻接表:https://blog.csdn.net/namewdy/article/details/105668761下面都以此图进行遍历:1.深度优先搜索深度优先搜索,Depth First Search,简称DFS。对于一个连通图,深度优先遍历的过程:从图中一个顶点 vvv 出发并访问 vvv 。找到刚访问顶点的第一个未被访问的邻接点并访问,并继续以该邻接点作为刚访问过的顶点,重复此步骤直到刚访问过的结点没有未被访问的邻接点为止。返回上一个访问过的且还有未被访问邻接.原创 2021-07-29 10:13:03 · 5023 阅读 · 0 评论 -
【数据结构】——图的最小生成树算法(普里姆+克鲁斯卡尔)
这里的图指的是带权无向图,也就是无向网。关于最小生成树,https://blog.csdn.net/namewdy/article/details/105645409图的最小生成树要解决的问题:用最小的代价连通图中的所有顶点。下面两种算法都是运用贪心思想,利用MST(Minimum Spanning Tree)性质构建最小生成树。MST性质: 假设N=(V, E)是一个连通网,U是顶点集V的一个非空子集。若(u, v)是一条具有最小权值的边,其中u∈U,v∈V-U,则必存在一棵包含边(u, v).原创 2021-07-29 10:09:47 · 2083 阅读 · 0 评论 -
【数据结构】——图的四种存储方式(待补)
以下包含一种顺序存储(邻接矩阵)和三种链式存储(邻接表、十字链表、邻接多重表)。 一、邻接矩阵二、邻接表三、十字链表四、邻接多重表一、邻接矩阵邻接矩阵是利用矩阵不同位置来表示任意两个顶点间的关系。对于含有nnn个顶点(v1,v2,...vnv_1,v_2,...v_nv1,v2,...vn)的图或网,需要一个n∗nn*nn∗n的矩阵用来存储。(为方便给这样的矩阵命名为A)对于图,若存储的是无向图,如果两个顶点vi,vjv_i,v_jvi,vj之间存在边(vi,vjv_i,v_jvi,.原创 2021-07-29 10:07:53 · 2567 阅读 · 0 评论 -
【数据结构】——图的定义和基本术语
图表示的是一种多对多的关系,相比线性表的一对一以及树结构的一对多,图的使用范围更广泛结构也更复杂,所以基本概念就更加重要。以下参考《数据结构C语言第2版》图的定义图(Graph)是由一组顶点和一组边的集合构成,记为 G = ( V, E ),其中V是vertex,顶点的意思;E是edge,边的意思。因此,V(G)和E(G)通常分别表示图G的顶点集合和边的集合。其中顶点集合不能为空,边的集合可以为空。若E(G)为有向边的集合,则G为有向图;若E(G)为无向边的集合,则G为无向图。有向图中顶点对&.原创 2021-07-29 10:05:18 · 2567 阅读 · 0 评论 -
【数据结构】——树、二叉树、森林之间的联系
一、树与二叉树的联系二、森林与二叉树的转换1.森林转二叉树2.二叉树转森林三、树的遍历&与二叉树遍历的联系四、森林的遍历&与二叉树遍历的联系一、树与二叉树的联系树与二叉树之间的联系建立在树的一种叫做孩子兄弟法的存储方式上面。这种孩子兄弟法的存储结构和二叉树相同都采用二叉链表。对于任意一棵树,让每个结点的左指针指向它的第一个孩子结点,右指针指向与它相邻的兄弟结点。这样既能实现整棵树的遍历又能方便的找到任意孩子结点。下面是将树转换成二叉树的过程:这种存储方式能够将所有的树转换成.原创 2021-07-29 10:03:31 · 2643 阅读 · 0 评论 -
【数据结构】——队列
一、队列的定义及特点二、顺序表示的循环队列三、链式表示的一般队列补充:用两个栈实现队列一、队列的定义及特点队列是一种只允许在表的一端删除(称作表头)和表的另一端加入(称作表尾)的线性表。从定义可以看出队列的特点是先进先出。二、顺序表示的循环队列概括来说循环队列是通过取模操作解决队列空间假溢出的问题,能更充分的利用所分配空间。因为在一般队列的顺序表示中,无论增加还是删除,头指针或尾指针都会递加,这样就会导致数组的低索引位置不可再被使用。这种弊端在链式表示中不存在,因为链式表示中并不是一次开辟所.原创 2021-07-29 10:01:28 · 1816 阅读 · 0 评论 -
【数据结构】——二叉排序树
一、定义二、存储三、查找四、插入五、创建六、删除一、定义二叉排序树也叫二叉查找树,或者是空树,或者是具有下列性质的二叉树:若它的左子树不空,则左子树上所有的值均小于它的根结点;若它的右子树不空,则右子树上所有的值均大于它的根结点;它的左右子树也分别为二叉排序树。从上面定义可以看出二叉排序树一个很重要的性质:中序遍历可以得到一个结点值严格递增的有序序列。严格递增代表树中没有值相等的结点。(相等也容易实现,只需要在插入的时候修改下查找条件。)二、存储采用二叉链表,相应的结点结构// 结点.原创 2021-07-28 21:05:03 · 1817 阅读 · 0 评论 -
【数据结构】——线索二叉树
目录一、什么是线索二叉树二、线索二叉树的存储方式三、二叉树线索化及遍历(一)前序线索化及遍历(二)中序线索化及遍历(三)后序线索化及遍历四、带头结点的中序线索化五、总结一、什么是线索二叉树概括来讲,线索二叉树就是将二叉树中空的指针域利用了起来,用来保存遍历过程中前驱结点和后继结点的信息。其中这样的信息叫做线索。二叉树的遍历其实就是一个将非线性结构(树,一对多的关系)转化成一个线性结构(线性表,一对一的关系)的过程。得到的线性序列中除第一个结点和最后一个结点外其它结点都只有一个直接前驱和一个直接后继(简原创 2021-07-28 21:04:08 · 7645 阅读 · 1 评论 -
【数据结构】——栈
一、定义及特点二、栈的两种实现(一)顺序栈(二)链栈三、栈与递归(一)递归(二)递归与递归工作栈(三)利用栈将递归转换为非递归一、定义及特点栈(stack) 是只在表的一端进行插入和删除操作的线性表(线性表指的是元素之间一对一的关系而不是顺序存储与链式存储)。被操作端称为栈顶,另一端称为栈底。从上面可以看出先入栈的元素被压在栈底后出来,后入栈的元素在栈顶先出来,因此栈有后进先出的特点。二、栈的两种实现(一)顺序栈public class MyStack { private int[] arr.原创 2021-07-28 20:54:46 · 340 阅读 · 0 评论 -
字符串匹配算法(BF、KMP)
BF算法描述: BF,Brute Force,暴力匹配的意思,是最简单直观的字符串匹配算法。假设有主串s1和子串s2,根据BF算法判断s1是否包含s2的步骤如下:初始下标指针 i, j 分别指向s1, s2的首位置,若s1[ i ]与s2[ j ]匹配成功,则 i++, j++ 继续匹配s1和s2的下一位;若匹配失败主串下标指针 i 回溯到本趟起始匹配位置的下一位,继续从子串首位开始匹配;重复以上操作,直到s1或s2被全部匹配完,根据 j 与子串的长度大小关系可以确定子串是否被包含。java代原创 2021-07-28 20:49:27 · 2574 阅读 · 0 评论 -
分治思想之归并排序
描述: 归并排序就是将两个或两个以上有序表合并成一个有序表的过程,其中将两个有序表合并成一个有序表的过程称为2-路归并。下面以2-路归并为例其排序过程是:假设初始序列有n个元素,则可看成n个长度为1有序子序列,然后两两归并,得到⌈n/2⌉\lceil n/2 \rceil⌈n/2⌉(向上取整,大于等于n/2的最小整数)个长度为2或1(奇数个元素剩个元素单独成列)的有序子序列;再两两归并,如此重复,直到得到一个长度为n的有序序列为止。其中两个有序子序列合并成一个序列的过程为:初始两子序列下标都指向首元素原创 2021-07-28 20:46:01 · 185 阅读 · 0 评论 -
选择排序(简单选择、堆排序)
简单选择排序描述: 简单选择排序,也称直接选择排序。排序过程如下:找出第一个元素起到后面所有元素中的最小元素,和第一个元素不相等时相互交换位置;找出第二个元素起到后面所有元素中的最小元素,和第二个元素不相等时相互交换位置;以此类推,直到第n-1个元素。java代码public void selectSort(int[] arr) { int min, temp; for (int i = 0; i < arr.length - 1; i++) { // n个元素需要n-1趟查找原创 2021-07-28 20:40:28 · 455 阅读 · 0 评论 -
桶排序思想(计数排序、基数排序)
计数排序描述: 计数排序运用了桶排序思想,是种非比较排序,具体步骤是:假设有长度为n的待排序列,取值范围min~max,首先创建和待排序列范围等长(max-min+1)的统计数组,从前到后遍历序列,每有一个元素xxx,数组对应下标(xxx-min)处值+1,这样遍历完序列后,统计数组下标+偏移量min=代表的真实数值,该下标位置处的值代表这个元素出现的次数。对统计数组从前到后遍历,除首元素外任一位置值=该处值+前一位置值,目的是为了得到将原数组拷贝到新数组时每个元素应该放入的位置。从后往前遍历原数原创 2021-07-28 20:41:50 · 217 阅读 · 0 评论 -
交换排序(冒泡排序、快速排序)
冒泡排序描述: 通过两两比较相邻元素,如果存在逆序就进行交换,从而使小元素向前移大元素向后沉。具体如下:设初始n个元素,首先第1和第2个元素比较,若逆序就交换;然后比较第2和第3个元素,以此类推直到第n-1和第n个元素;此时完成第一趟比较,作用是使最大元素被交换到最后也就是第n个位置上。然后进行第二趟比较,对前n-1个元素进行同样操作,使次大元素被交换到第n-1个位置上。以此类推,直到循环结束或某趟比较中没有发生元素交换。java代码public void bubbleSort(int[]原创 2021-07-28 20:39:13 · 426 阅读 · 0 评论 -
插入排序(直接插入、二分插入、希尔排序)
直接插入描述: 从原始序列第二个元素起,依次选取并插入到前面合适的位置,直到序列最后一个元素完成插入。java代码public void insertSort(int[] arr) { int temp, j; for (int i = 1; i < arr.length; i++) { // 从第二个元素起 temp = arr[i]; // 取出待排元素 // 待排元素与它前面的元素从后往前比较,根据比较结果判断前面元素是否后移 for (j = i;原创 2021-07-28 20:36:07 · 204 阅读 · 0 评论