数据结构
文章平均质量分 87
前端晓晓
up up up
展开
-
数据结构篇二十:字符串匹配
##字符串匹配这章节,我们会讲到几大典型的字符串匹配算法1. BF算法2. RK算法3. Sunday算法4. KMP算法BF算法BF算法是最最符合正常人逻辑思维的一种匹配模式,它就是采取穷举的方式,一步步进行主串与模式串的比较,匹配成功返回主串匹配开始的位置。接下来我们一起通过例子来看看这种让人喜欢用的算法吧,假设现在我们有主串abcdefg,待匹配的模式串efg,我们来找出模式串在主串出现的位置。准备工作表格1是主串在数组的存储格式,表格2是模式串在数组的存储格式,我们设置原创 2021-03-26 14:58:35 · 401 阅读 · 0 评论 -
数据结构篇十九:图的最短路径
图的最短路径迪杰斯特拉算法贝尔曼-福特算法弗洛伊德算法SPFA算法(中国西南交通大学段凡丁发明)最短路径问题分为两类,一大类是求一个顶点到其余各顶点的最短路径问题,另一大类是求各个顶点间最短路径问题。迪杰斯特拉迪杰斯特拉算法就是求解一个点到其余各点的最短路径算法,无向图带权图和有向带权图都适用。缺点是不适用权值为负数的图(后面会讲解原因)算法步骤初始的点为起点,我们用s集合存储已经确定最短路径的点的集合,那么s={v},起点加入。其余各个点到v点的权值存储在dis数组里,不是原创 2021-03-25 21:14:09 · 700 阅读 · 0 评论 -
数据结构篇十八:图的拓扑排序
拓扑排序拓扑排序是针对有向无环图定义的,此算法可以判断一个有向图是否存在回路。拓扑排序反应的是活动和工程的先后执行顺序。就好比我们CS专业的同学们,学习数据结构前我们得先离散数学这门课,学习算法,我们又得依托数据结构这门课。。。。拓扑排序主要是根据一个有向图写出活动或工程的序列问题,如何写出该有向无环图的序列?从有向图中选择一个 没有前驱(即入度为0)的顶点并输出,并删除该顶点和所有以它为起点的有向边。(其实就是删除该点和该点有关联的边)重复上面过程,直到所有点被输出(此时可证明无环)原创 2021-03-25 19:28:20 · 3937 阅读 · 0 评论 -
数据结构篇十七:图的最小生成树
最小生成树引论:研究最小生成树之前,我们还是先搞清楚什么是生成树。子图包含原图的所有顶点且边数等于顶点数减去一,并且要求子图不产生回路。总结起来就三点:1.包含图所有顶点。2.边个数等于顶点个数减去一。3.围成的新图不能产生回路(就是树了)概念是死板的,我来画图演示。根据概念,我们知道生成树的是不唯一的,我们列举出3种生成树。深度优先遍历![在这里插入图片描述](https://img-blog.csdnimg.cn/20210325192337181.jpg?x-oss-process=原创 2021-03-25 19:25:25 · 2167 阅读 · 1 评论 -
数据结构篇十六:图的深搜和广搜二
图的深搜和广搜前面一篇是利用深搜和广搜进行图的顶点的遍历,今天我们则是根据起点和终点位置进行路径的搜索。图的深搜算法问题:假设现在有一无向图,我现在要给你一个起始点和终点,如果可以走通请输出一条简单路径,不能则返回无路径。思考:我们可以考虑用深度搜索去求解此问题,我们假设用邻接矩阵存储这个图。我们可以设计一个数组去保存搜索过程的路径。注意点:算法的设计关键就是利用深搜递归可以回退参数的特点去求解,但是由于c语言的普通数组,传递的参数都是实参,无法进行回退,所以我们需要自定义伪数组去实现真正的形原创 2021-03-25 19:22:41 · 482 阅读 · 0 评论 -
数据结构篇十五:图和广搜和深搜一
图的深度和广搜优先遍历深度优先遍历深度优先搜索就好比走迷宫,当走到一个岔路口时,你随机选择一条路往下走,当发现走到前面无路可走时,回退到前一个岔路口重新选择另一条道路去重复上述过程。我们按照上图去走一遍深度优先搜索你就清楚了。随机选择一个起点,此处是1,有3个岔路口可选择我们随便选,就选数字2,然后继续判断2只有一个岔路口,只能向前走,走到了4,接下来发现4无路可走了,我们要回退一步到2,发现2也无路可走(每次都不包含走过的)继续回退到1上,发现1还有两个岔路口可走,我们选择3,继续向前,3发原创 2021-03-25 19:21:06 · 356 阅读 · 0 评论 -
数据结构篇十四:图和图的存储
图如何理解图?前面我们学习了线性表,链表,树等基础数据结构,图这种数据结构就是它们的综合利用。我们都知道,图有边和顶点组成,图的知识点比较多,我这里只是简单从数据结构简要分析。1.图的种类根据方向:无向图和有向图根据权值:无权图和有权图2.图的术语度:度的概念是针对图的顶点而言的,在无向图中,度表示某个顶点周围有几个顶点与其相连接,在有向图中,分为入度和出度的概念,入度表示该顶点周围多少个点指向自己,出度表示该顶点指向几个点带权图:就是图中边上面的数据,描述边的附加信息。联原创 2021-03-25 19:18:15 · 723 阅读 · 0 评论 -
数据结构篇十一:二叉查找树
二叉查找树1.什么是二叉查找树?二叉查找树是一种支持数据动态的插入,删除,查找的数据结构。2.二叉查找树的设计要求任意一个节点的左孩子必须小于当前节点任意一个节点的右孩子必须大于当前节点整个二叉树的数据不能重复如下图所示3.二叉排序树数据的查找既然二叉排序树每个节点的左孩子都小于当前节点,每个节点的右孩子都大于当前节点,所以我们可以根据这个特性,很容易查找数据。下面是查找步骤数据小于当前节点,向左走一步数据大于当前节点,向右走一步找到就退出,反之当走到叶子节点,还没找原创 2021-03-25 07:47:41 · 367 阅读 · 0 评论 -
数据结构篇十:二叉树
二叉树对于树这块,基础部分都好理解,我仅仅整理树的难点知识我们先想一下,二叉树如何存储?顺序存储还是链式存储?我们尝试用这两种方式都去尝试存储树1.二叉树的顺序存储我们用一个数组去顺序存储二叉树的节点。从数组下标1开始存储是为了方便计算孩子位置每个节点的左孩子下标=2当前节点位置, 每个节点的右孩子下标=2当前节点位置+1对比上图,很容易看出啦。观察这个二叉树,数组很多空间没有被利用,所以顺序存储造成了巨大浪费。我们对比图1,发现,顺序存储适合存储完全二叉树。2.二叉树的链式存储原创 2021-03-24 18:15:46 · 629 阅读 · 0 评论 -
数据结构篇九:散列表
散列表1.什么是散列表?散列表就是通过一个映射函数,把每个数据映射为一个数组下标,按照下标存储起来,当我们访问这个数据时,只需要通过映射函数计算出下标,就可以找到这个数。2.散列表映射函数从散列表定义来看,散列表最重要的是设计映射函数,映射函数决定效率和减少地址冲突,常见的映射函数有下面的几个。。。直接定址法数学分析法除留取余法随机数法3.散列表的冲突问题不管我们设计的散列函数多牛逼。都无法避免数据映射冲突问题,冲突就是两个数据经过映射函数处理后得到的数据是一样的。这个时候不可能把它原创 2021-03-24 18:09:56 · 268 阅读 · 0 评论 -
数据结构篇八:二分查找
二分查找和拓展篇引言:如何在最短时间内,在有序数据中,找出目标数据?顺序查找?随机查找?不不不,那就是伟大的二分查找思想。今天我们来讨论二分查找的思想和其它4种拓展思维。最后还会介绍一种伟大的数据结构,也是用了二分查找的思想,它就是跳表。二分查找基于二分查找的其它思想跳表(redis)的简介1.二分查找例子:假设我们根据上图数据,已经排好序,找数据19的位置。如何用二分思想?1.我们先设置low,high,mid三个标记,low总是指向范围的下界,high指向上界,mid就是(low+原创 2021-03-24 18:07:45 · 212 阅读 · 0 评论 -
数据结构篇七:十大排序三
十大排序(3)今天我们学习10大排序的第三大类0(n)时间复杂度的排序计数排序桶排序基数排序1.计数排序本节的排序我首先给出排序的步骤,然后,我们根据步骤对数据进行一次完整的排序模拟,然后总结该排序算法的性能。算法步骤找出待排序数组arr1的最大值和最小值(确定数字范围)根据arr1数组值的范围确定辅助数组arr2对应范围内的下标所存储的值是0.逐个遍历arr1数组,将每次遍历到的数据data作为arr2数组的下标,给arr2数组对应下标data对应的值加上1。将arr2数原创 2021-03-24 18:05:15 · 239 阅读 · 0 评论 -
数据结构篇六:十大排序二
十大排序(2)今天先学习第二大类排序算法归并排序排序排序希尔排序堆排序1.归并排序分析:利用归并的思想将待排序数据,先划分成一个个小块,在两两合并数据,最后整体有序举例分析:假设我们有数据arr[i…k…j],其中的i就是下界,j就是上界,k就是中间位置,我们要让整个数组有序。只需要让数组arr[i…k]有序,arr[k…j]也有序,然后让两个数组合并,那么整体就有序了。//归并排序void sort_Merge(int *arr, int low, int high){原创 2021-03-24 16:55:07 · 154 阅读 · 0 评论 -
数据结构篇五:十大排序一
十大排序一我们把10大排序算法可以划分为三大类学习,今天先学习第一大类基础排序算法冒泡排序选择排序插入排序1.冒泡排序分析:冒泡排序每次都是从第一个元素开始往上冒泡,总是拿当前元素和下一个元素作比较。一趟结束后总能选出待排序中最大的元素1.当前元素小于等于下一个元素时,不交换,直接让下一个元素继续往上冒泡2.当前元素大于下一个元素时,与其交换值,继续网上冒泡。我们可以看动图分析我这两句话。void sort_Bubble(int* arr, int len){ int temp原创 2021-03-24 15:45:47 · 135 阅读 · 0 评论 -
数据结构篇四:队列
如何理解队列?队列这个概念非常好理解。你可以把它理解成排队买火车票,购票的人只能从队伍的最后面进入,并且每次出去的总是队头的那个。我们知道栈支持入栈和出栈的操作,和栈类似,队列支持入队和出队操作。最基本的队列有两大类,顺序队列和链式队列,顺序队列又可以细分为两类,普通顺序队列和循环队列接下来,就让我们一一分析这几大类队列吧。第一类:顺序队列原理:顺序队列是用数组模拟的,并且添加两个哨兵front和rear(大学课本称之为头指针和尾指针),front指向队列第一个元素,rear指向队列的最后一个元素原创 2021-03-24 15:41:25 · 426 阅读 · 0 评论 -
数据结构篇二:链表
链表定义所谓链表,见名知意就是将数据链接起来,那数据肯定不是连续的排列在一起的,确实链表就是用指针将许多个内存块连接起来的数据结构。这一模块,我将描述链表的四大类结构,单链表,循环单链表,双链表,循环双链表。单链表我们先看下单链表的结构体/*定义单链表的节点*/struct Node{ struct Node* next; int data;};/*定义单链表总体*/struct List{ struct Node* head;//链表头节点 int size;//链表元素原创 2021-03-24 12:03:07 · 197 阅读 · 0 评论 -
数据结构篇一:数组
数据结构篇一:数组数组是一种线性的数据结构,它用一组连续的存储空间来存储数据相同的数据对于数组,相必大家都知道吧,不管是C,Java,Python,JavaScript,Go语言等等都有数组,由于JavaScript是一门弱语言,它设计数组可以存储不同数据类型。下面我们来分析下数组的增删改查操作和它的性能查找和修改数组中查找和替换都是通过下标直接操作的,时间复杂度都是0(1),提醒下,此处的查找是指给定一个数组下标,找出数组对应的元素。添加元素看上图,就很容易知道,数组在指定位置插入数据时原创 2021-03-24 11:55:42 · 167 阅读 · 0 评论