![](https://img-blog.csdnimg.cn/direct/540d888d50fe408fb21cf787d196263d.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法
文章平均质量分 67
常见数据结构:数组、链表、栈、队列、哈希表、二叉树、AVL树、红黑树、234树、图的学习笔记。
常见算法:递归、二分查找、5种排序、字符串匹配、贪心算法、分治算法、回溯算法、动态规划学习笔记。
Starry-Leo
大多都是学习笔记,方便自己随时复习,所以博客有时候没有写得很详细,望海涵~~~
联系邮箱:xxliao100@163.com
展开
-
Java实现数据结构---数组
数组是(Array)是的变量所组成的集合,数组中的每一个变量为称为。数组是最简单、最常用的数据结构。数组下标从开始。原创 2024-05-28 12:05:52 · 313 阅读 · 0 评论 -
Java实现数据结构---链表
链表(Linked list)是一种在物理上不连续、非顺序的数据结构,由若干个节点(Node)组成。链表中元素的逻辑顺序是通过链表中的指针链接次序实现的。原创 2019-06-19 10:44:20 · 197 阅读 · 1 评论 -
Java实现数据结构---栈
栈作为一种抽象的数据数据,只允许在一段进行插入或者删除的线性结构,其主要的特点就是“先进后出”。原创 2019-06-19 23:30:24 · 105 阅读 · 1 评论 -
Java实现数据结构---队列
队列是一种抽象的数据结构,是一种只能在一端插入,在另一端获取的有序线性表。队列中第一个插入的元素也是第一个获取的元素,队列的数据到达次序符合“先进先出”的思想。原创 2019-06-20 16:09:28 · 161 阅读 · 1 评论 -
Java实现数据结构---哈希表
1. 哈希表(Hash Table)也称为散列表,是一种根据关键字值(key - value)而直接访问的数据结构。它的底层是基于数组实现,通过对键值对的key进行Hash求值(哈希化)算出对应的数组下标索引,因此不需要遍历整个底层数组,插入删除效率均很快,被广泛应用。原创 2019-10-24 14:38:01 · 302 阅读 · 1 评论 -
Java实现数据结构---二叉树
树是一种由边连接着结点的数据结构,数据模型上的树可以看做是一棵倒挂的树木,有一个主干,下面是枝干、树叶。树的常用语: 根:树的最顶端节点称为根,一棵树只有一个根。且根到任意一节点有且只有一条路径。父节点:每个节点(排除根)都恰好有一条边向上连接另一节点,上面这个节点就是下面节点的父节点。例如:A是B和C的父节点,B是D和E节点的父节点。子节点:每个节点都有可能存在一条或者多条边向下连接其他节点,下面节点就是上面节点的子节点。原创 2019-06-21 15:14:58 · 331 阅读 · 1 评论 -
Java实现数据结构---AVL树
二叉搜索树在树较为平衡状态下,可以有效的提高数据的插入、删除、查询效率,但是不可避免二叉搜索树随着数据的插入、删除有可能会变为链表结构(利用有序的数据源依次添加),极大的降低效率,所以二叉搜索树最好时时刻刻都在相对平衡状态,也就是AVL的由来。AVL树也称为平衡二叉树,AVL树是一种特殊的二叉搜索树,特点是:树种任意节点的左右子树的最大高度差为1。原创 2019-07-02 16:20:25 · 323 阅读 · 1 评论 -
Java实现数据结构---红黑树
红黑树是一种自平衡树,它也是一颗二叉树。它和AVL树比较类似,在插入、删除过程中不平衡的话,也会进行旋转操作,但是并没有AVL树旋转得那么频繁,这也是红黑树被广泛应用的原因。红黑树主要有以下五个特性: 1. 节点的颜色为红色或者黑色; 2. 根节点为黑色; 3. 所有的叶子节点为黑色,叶子是NIL节点,也就是NULL节点; 4. 如果一个节点是红色的吗,那么他的左右子节点必须为黑色; 5. 从根节点到任意叶子节点的所有简单路径都包含数量相同的黑色节点。原创 2019-07-06 13:40:33 · 383 阅读 · 1 评论 -
Java实现数据结构---234树
一个节点最多只有两个子节点的树称为二叉树,一个节点最多拥有N(大于等于3)个子节点的树称为N叉树,N叉树相对于二叉树而言,存储相等数量的数据,N叉树因为同一层存放的数据变多,相应树的高度就变小,查询也就更快。234树是N叉树的一种,它主要具有以下特点: 1. 一个节点最多可以存储3个数据项。 2. 一个节点(非叶节点)最多拥有4个子节点。 3. 数据项个数与子节点数量关系为:子节点数量 = 数据项个数 + 1。原创 2019-07-18 17:30:42 · 2742 阅读 · 1 评论 -
Java实现数据结构---图
图(Graph)一种比线性表和树更加复杂的结构。在图形结构中,顶点(vertex)之间的关系是任意的,途中任意两个顶点之间都有可能关联。原创 2024-05-29 18:40:33 · 986 阅读 · 0 评论 -
算法(基础)算法复杂度
数据结构和算法本质上是”快“和"省"。所以代码的执行效率是非常重要的度量,我们采用时间复杂度和空间复杂度来计算。原创 2024-05-30 00:30:58 · 272 阅读 · 0 评论 -
算法(一)递归
递归算法是一种直接或者间接调用自身函数或者方法的算法。原创 2024-05-30 00:12:17 · 305 阅读 · 0 评论 -
算法(二)二分查找
二分查找(binary search)算法,也叫折半算法。二分查找是针对有序的数据集合的查找办法,如果是无序的数据结合就使用遍历。二分查找之所以快速,是因为它再匹配不成功的时候,每次都能排除剩余元素中一半的元素,因此包含目标元素的有效范围就会收缩非常快。时间复杂度: T(n) = O(logn)原创 2024-05-30 01:01:49 · 237 阅读 · 0 评论 -
算法(三)冒泡排序
冒泡排序(bubble sort)是一种基础的交换排序,该算法中每个元素都可以像小气泡一样,根据自身大小,一点一点地向着数组地一侧移动。具体算法:冒泡排序是将相邻地元素两两比较,当一个元素大于右侧相邻元素时,交换它们地位置,当一个元素小于或等于右侧相邻元素时,位置不变。原创 2024-05-30 11:43:01 · 240 阅读 · 0 评论 -
算法(四)快速排序
快速排序(quick sort)也属于交换排序,通过元素之间的比较和交换位置来达到排序的目的。具体算法:快速排序每轮挑选一个基准元素,并让其他比它大的元素移动到数列一边,比它小的元素移动到数列的另一边,从而把数列拆解成两个部分,使用的思路是分治法。基准元素(privot):在分治过程中,以基准元素为中心,把其它元素移动到它的左右边。原创 2024-05-30 13:54:26 · 314 阅读 · 0 评论 -
算法(五)堆排序
堆是具有特殊性质的完全二叉树,堆主要分为大顶堆和小顶堆。堆排序的基本思想是:将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了。原创 2024-05-30 17:36:57 · 515 阅读 · 0 评论 -
算法(六)计数排序
计数排序是利用数组下标来确定元素的正确位置的。假定数组有10个整数,取值范围是0~10,可以根据这有限的范围,建立一个长度为11的数组。数组下标从0到10,元素初始值全为0。假定给定无序数组数据为:9,1,2,7,8,1,3,6,5,3创建累计数组,然后遍历无序数组,每一个数按照其值对应累计数组索引下标进行对号入座,每出现一次该值,累计数据该索引下标的值就加1,最终就会得到下面的累计数组:然后遍历累计数组,就可以得到正确的顺序::1、1、2、3、3、5、6、7、8、9。原创 2024-05-30 21:26:34 · 227 阅读 · 2 评论 -
算法(七)插入排序
插入排序(insertion sort)是从第一个元素开始,该元素就认为已经被排序过了。然后取出下一个元素,从该元素的前一个索引下标开始往前扫描,比该值大的元素往后移动。直到遇到比它小的元素时候,比它小元素的下一个元素就是该元素的位置;当索引值为0的时候,那么索引为0的位置就是该元素的位置。原创 2024-05-30 22:25:34 · 272 阅读 · 0 评论 -
算法(八)选择排序
选择排序(selection sort)是每一次从待排序列中先择一个最小值,然后将该值放在序列的起始位置(第一次是起始位置,后面就一次放在该值后面),直到全部待排数据排完位置。实际中,我们可以同时选出两个值,一个最小值放在序列开头,一个最大值放在序列末尾,这样效率就会高一倍。原创 2024-05-30 22:57:34 · 139 阅读 · 0 评论 -
算法(九)希尔排序
希尔排序(shell sort)选定一个小于N(数列长度)的整数gap作为第一增量,然后将所有距离为gap的元素分成一组,然后对每一组的元素进行插入排序。然后再取一个比前一个增量小的整数作为增量,重复上面的步骤操作…当增量大小减少到1时候,就相当于对整个序列再进行一次插入排序,然后排序完成。原创 2024-05-30 23:57:17 · 323 阅读 · 0 评论 -
算法(十)归并排序
归并排序(merge sort)是一个采用了分治法的典型应用,首先将数据一半一半的向下拆分,直到拆分到最小元素为止;然后从拆分的最小元素开始,按照原路径进行合并,合并的时候进行排序;直到全部元素合并完成,排序完成。归并排序使用了递归思想(一级一级向下拆分、然后按照原路径一级一级向上合并)原创 2024-05-31 01:52:07 · 626 阅读 · 0 评论 -
算法(十一)贪婪算法
贪婪算法(Greedy)是一种在每一步都采取当前状态下最好的或者最优的选择,从而希望导致结果也是全局最好或者最优的算法。贪婪算法是当下局部的最优判断,不能回退。贪婪算法的高效性,以及所求得的答案比较接近最优结果,因此贪心算法可以作为辅助算法或者解决一些要求结果不那么精确的问题。原创 2024-05-31 20:03:43 · 3177 阅读 · 0 评论 -
算法(十二)分治算法
将字符串中的小写字母转化为大写字母,“abcde”转化为"ABCDE",我们可以利用分治的思想将整个字符串转化成一个一个的字符处理。比如: 2^10 2的10次幂。原创 2024-05-31 21:47:54 · 444 阅读 · 0 评论 -
算法(十三)回溯算法---N皇后问题
回溯算法是类似枚举的深度优先搜索尝试过程,主要是再搜索尝试中寻找问题的解,当发生不满足求解条件时,就会”回溯“返回(也就是递归返回),尝试别的路径求解。N皇后问题研究的是:如何将n个皇后放在n * n的棋盘上,并且使皇后彼此之间不能相遇,也就是一个皇后的上下左右、以及斜着对角线上都不能有另外一个皇后,也就是一个皇后在 ”米“ 的视线中不能遇到另外一个皇后。原创 2024-06-01 00:45:49 · 1174 阅读 · 0 评论 -
算法(十四)动态规划
动态规划(Dynamic Programming)是一种分阶段求解的算法思想,通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(分治)的方式去解决。动态规划中有三个重点概念:最优子结构:按照最佳的方式进行拆分,用来描述问题状态与状态之间的关系;边界:问题的边界区域,可以是除了最优子结构的其它区域;状态转移公式(递推公式)dp方程:根据最优子结构和边界终结出来的方程。原创 2024-06-01 01:36:11 · 386 阅读 · 0 评论 -
字符串匹配算法(一)BF算法、RK算法
BF算法也就是Brute Force 算法,中文叫暴力匹配算法,也叫朴素匹配算法。 - 模式串和主串:例如:我们在字符串A中查找字符串B,那么字符串A就是主串,字符串B就是模式串。 - 主要思路:我们在主串中,检查其实位置分别是0 ~ n-m(n是主串A的长度,m是模式串B的长度)且长度为m的n-m+1个字串,看有没有跟模式串匹配的。原创 2024-05-31 14:05:34 · 268 阅读 · 0 评论 -
字符串匹配算法(二)BM算法
BM算法也就是Boyer Moore算法,它是一种非常高效的字符串匹配算法,是一种滑动算法。什么是滑动?下面例子中,主串中的c,在模式串中不存在,所以模式串可以往后华滑动,因为只要有c存在,那么该字串肯定与模式串不匹配。BM算法,本质上其实就是在寻找这种规律,借助这种规律可以高效的实现字符串匹配。为了实现正确的滑动,BM算法包含了两个部分,分别是坏字符规则(bad character rule)和好后缀规则BM算法的匹配顺序是按照模式串的下标从大到小的顺序进行匹配。原创 2024-05-31 17:10:30 · 777 阅读 · 0 评论 -
字符串匹配算法(三)Trie树算法
Trid树,也叫”字典树“。它是一个树形结构。专门处理字符串匹配的数据结构,用来解决字符串集中快速查找某个字符串的问题。Trie 树的本质,就是利用字符串之间的公共前缀,将重复的前缀合并在一起。比如:有 6 个字符串,它们分别是:how,hi,her,hello,so,see,我们可以将这六个字符串组成下面的Trie树结构。其中,根节点不包含任何信息。每个节点表示一个字符串中的字符,从根节点到红色节点的一条路径表示一个字符串(红色节点为叶子节点)原创 2024-05-31 18:29:13 · 400 阅读 · 0 评论