![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法与数据结构
文章平均质量分 65
拿么娜娜
这个作者很懒,什么都没留下…
展开
-
数据结构与算法学习(十四)——字符串匹配算法(二)
上一篇讲的BF、RK、BM、KMP算法都是单模式串匹配算法,即一个主串与一个模式串匹配,本篇将介绍两种多模式串(一个主串与多个模式串匹配)匹配算法——Trie树和AC自动机Trie树1、Trie树又叫字典树,用来解决一组字符串集合中快速查找某个字符串。其中一组字符串对应的就是模式串,某个字符串指的就是主串。2、Trie树本质:利用字符串中的公共前缀,将重复的前缀合在一起,构成一棵树。例有一组字符串:hello hi her how see so,构成的Trie树如下:(1)根节点不含任何信息(原创 2021-05-24 22:46:55 · 165 阅读 · 0 评论 -
数据结构与算法学习(十四)——字符串匹配算法(一)
BF算法1、BF算法(Brute Force):暴力匹配算法,最常用的字符串算法2、字符串匹配算法中最常用的两个定义:主串与模式串,主串指的是被查找的串,模式串为要查找的串。例:A串中查找B串,则A为主串,B为模式串。3、BF算法原理:从主串的起始位置分别为0,1,2…n-m检查长度为m(模式串的长度)的n-m+1个子串(n为主串长度),是否有与模式串匹配的字符串。简单的来说,即从头开始,将模式串与主串匹配。注:若检查的位置到n-m+1,则主串剩余长度小于m,比模式串的长度小,无需匹配。4、时间复原创 2021-05-23 23:16:41 · 249 阅读 · 0 评论 -
数据结构与算法学习笔记(十三)——图
图1、图是一种非线性表结构。组成图的各个点为顶点,连接顶点的为边,边的条数为度2、图根据图的边是否有方向,可分为有向图和无向图;根据图的边是否有权重,分为带权图和无权图,其中带权图中也有带权有向图和带权无向图。有向图:有向图中若有x条边指向顶点A,则顶点A的入度为x,若顶点A有y条边指向其他顶点,则顶点A的出度为y。无向图:带权无向图:图的存储方式1、邻接矩阵存储邻接矩阵存储使用二维数组表现。(1)无向图的邻接矩阵存储:若i和j之间有边,则A[i,j]和A[j,i]=1(2)有向原创 2021-05-09 18:10:55 · 198 阅读 · 1 评论 -
数据结构与算法学习笔记(十二)——堆
堆1、堆是一个完全二叉树,堆中的每一个节点的值都必须大于等于(小于等于)其子树中每个节点的值。2、每个节点的值都大于等于其子树中的每个节点的值,此为大顶堆。大顶堆的堆顶元素为最大的元素3、每个节点的值都小于等于其子树中的每个节点的值,此为小顶堆。小顶堆的堆顶元素为最小元素上图中的1、2均为大顶堆,3为小顶堆,4不是堆查找、插入、删除1、查找:堆是完全二叉树,因此堆的存储方式也是数组存储。因此只要知道一个节点就可以推出其他节点的存储位置。2、插入:若直接往叶子节点中插入一个元素会使堆不满足堆的原创 2021-05-09 17:35:46 · 367 阅读 · 0 评论 -
数据结构与算法学习笔记(十一)——红黑树
红黑树1、为什么要有红黑树?二叉查找树在不断的动态更新中,可能会退化成链表,出现树的高度远远大于O(log2n)的情况,所以有一种平衡二叉查找树——红黑树,可以在动态的更新中不断调整节点的位置,使该树一直保持相对平衡,不至于将时间复杂度退化到O(n)。因此红黑树的性能非常稳定,可以应用于动态插入、删除、查找数据的场景。2、红黑树是一种近似平衡的二叉查找树,且查找、插入、删除的时间复杂度都在O(logn)平衡二叉树:其任意一个节点的左右子树的高度相差不能大于1。合格的平衡二叉树:树的高度不会比lo原创 2021-05-09 16:35:26 · 168 阅读 · 0 评论 -
数据结构与算法学习笔记(十)——二叉查找树
定义1、二叉查找树树中的任一节点,其左子树的节点都小于该节点,其右子树的节点都大于该节点2、二叉查找树支持快速查找、插入、删除查找、插入、删除1、查找:(1)递归查找,若要查找的节点p值大于root的值,则在其右子树进行递归查找,反之则在其左子树进行递归查找。(2)时间复杂度:在O(logn)~O(n)之间,最好是O(logn),此时树为完全二叉树;最坏为O(n),此时树退化为了链表2、插入:(1)一般插入在叶子节点。先递归查找,比较要插入的节点p与已存在节点的大小关系。若p>roo原创 2021-05-09 16:23:09 · 176 阅读 · 0 评论 -
数据结构与算法学习笔记(九)——二叉树
二叉树定义1、树的定义:只有一个根节点,每个非根节点有且只有一个父节点节点的高度:该节点到叶子节点的最长路径(边数)节点的深度:该节点到根节点的边数节点的层数:该节点的深度+1树的高度:根节点的高度2、二叉树:每个节点最多有两个叉,即左右子节点3、满二叉树:叶子节点全部在最底层,除叶子节点外,所有节点都有左右两个子节点4、完全二叉树:叶子节点全部在最底下两层,且最后一层的子节点从左到右是连续的,中间无断开。且除了最后一层,其他层的节点个数都要达到最大。1为二叉树,2为满二叉树,3为原创 2021-05-09 15:52:30 · 206 阅读 · 0 评论 -
数据结构与算法学习笔记(八)——散列表(二)
散列表+双向链表1、上一篇讲到使用链表法来解决散列冲突,是单链表。这一节为散列表+双向链表的使用。但该双向链表与散列表无任何关系,与链表法中的单链表不一样,散列表+双向链表只是将两种数据结构结合在一起,用于更高效的查询、插入和删除。2、图中可以看出,双向链表中有四个指针,data存储数据,prev、next分别为前驱和后继指针,将结点串在双向链表中,保证双向链表的有序性,提高插入和删除的性能。hnext表示将结点串在散列表的拉链中,作用类似于链表法中的单链表的 next指针,即用于解决散列冲突即,原创 2021-05-07 23:22:06 · 121 阅读 · 0 评论 -
数据结构与算法学习笔记(七)——散列表(一)
定义1、散列表又叫hash table,哈希表。利用数组支持按照下标随机访问数据的特性,在数组上进行扩展得到的散列表。关键字(key)通过散列函数得到散列值———在散列表中,以散列值为下标查找对应的值2、通过散列函数计算出的散列值只能为非负整数,因为数组的下标是从0开始3、key相同的话,生成的散列值也一定相同。key1=key2,hash(key1)=hash(key2)4、key不同的话,生成的散列表也可能相同,此为散列冲突(哈希冲突)。这时在散列表中根据散列值查找到的数据还需要比较key值。原创 2021-05-07 22:36:02 · 163 阅读 · 0 评论 -
数据结构与算法学习笔记(六)——跳表
定义跳表是一种动态数据结构,针对有序链表进行稍加改造即可形成跳表。在有序链表中每隔几个结点就提取一个结点到上一级作为索引,此为第一级索引。再针对第一级索引继续添加索引,此为第二级索引。这种为有序链表添加多级索引的结构为跳表。查找1、单、双链表的查找是从头开始遍历,因此时间复杂度为O(n)2、跳表的查找则是先根据索引进行遍历,确定结点区间后,下降到下一层再继续查找。例:查找上图跳表中的5号结点。(1)先遍历第二级索引,5号结点肯定是在1号和7号索引之间,所以从1号索引下降到第一级索引的1号结点中原创 2021-05-02 11:15:09 · 191 阅读 · 0 评论 -
数据结构与算法学习笔记(五)——二分查找
原理将数组有序后,找到数组的中间点mid,若要查找的值x>mid,则查找范围变为[mid+1,right];若x<mid,则查找范围变为[left,mid-1],直至找到x或区间变为0。原创 2021-04-07 22:49:01 · 151 阅读 · 0 评论 -
数据结构与算法学习笔记(四)——排序(二)
线性排序线性排序的特点是非基于比较的排序算法,不涉及元素之间的比较操作。包括有桶排序、计数排序和基数排序桶排序原理:将要排序的数据分到几个天然有序的桶里,在每个桶中再进行单独排序,最后依次从桶中按顺序取出每个桶中的顺序即可 时间复杂度:O(n)应用场景:适用于外部排序,即数据存储在外部磁盘中,数据量过大,而内存空间不够,即可将对应划分好的桶加入内存中进行排序。限制性:要排序的数据能容易的被划分为m个具有天然顺序的桶且每个桶中的数据分布要尽可能的均匀。计数排序原理:计数排序是桶排序的一原创 2021-04-06 22:57:19 · 113 阅读 · 0 评论 -
数据结构与算法学习笔记(三)——排序(一)
排序算法的比较点最好、最坏、平均时间复杂度的比较时间复杂度的常数、低阶、系数的比较比较、交换的次数算法的是稳定的还是非稳定的:若经过排序后,之前待排序数组的相等元素的原有的先后顺序不变,则表示排序算法是稳定的,否则非稳定排序算法算法的内存消耗:若空间复杂度为O(1),则为原地排序冒泡排序原理:将相邻的两个元素进行比较,若满足大小要求,则不交换,否则就交换。若某一次冒泡中没有任何元素进行了交换,则可以结束冒泡。特点:每一次冒泡至少会有一个元素移动到它正确的位置冒泡排序是原地原创 2021-04-05 19:56:29 · 129 阅读 · 0 评论 -
数据结构与算法学习笔记(二)——数据结构
数组定义一种线性表数据结构,用一组连续的内存空间来存储数组,且数组中的数据都为相同类型。因此访问数组的本质就是访问一段连续的内存,一维数组的寻址公式如下:a[i]_address=base_address+kdata_type_size注:base_address表示基地址data_type_size表示数组中的一个数据占的内存大小kdata_type_size就表示第k个数据的偏移量二维数组的寻址公式:在m行n列的二维数组,a[i,j](i<m,j<n)a[i,j]_a原创 2021-03-27 22:09:28 · 188 阅读 · 0 评论 -
数据结构与算法学习笔记(一)——时间复杂度
前言最近开始重新学习数据结构与算法啦,为了巩固自己记忆,所以接下来会每学习完成一个知识点,就归纳总结出一篇学习笔记,用于后续的复习~数据结构与算法的定义数据结构:一组数据的存储结构算法:操作数据的一组方法,作用于特定的数据结构上大O时间复杂度定义:大O时间复杂度表示法,并不具体的表示代码真正的执行时间,而表示代码执行时间随数据规模增长的变化趋势。所有代码的执行时间T(n)与每行代码的执行次数f(n)成正比:T(n)=O(f(n)) O表示T(n)与f(n)成正比时间复杂度分析1、只原创 2021-03-08 17:35:40 · 212 阅读 · 0 评论