![](https://img-blog.csdnimg.cn/c8bbb49e1d6b41caab07efcf3983c1de.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法
文章平均质量分 96
从软件工程师的角度理解数据结构与算法,并且使用Go语言对常用算法的实现。主要介绍如下数据结构:数组、链表、堆、栈、队列、树、跳表、图;以及如下算法:递归、排序、查找、贪心算法、哈希算法、分治算法、深度优先、广度优先、动态规划等。
浮尘笔记
这里记录的都是自己学习和工作中的一些笔记和经验,觉得有用的可以常来看看。
展开
-
数据结构与算法12:图、广度优先、深度优先
树表达的是层级化的结构,图表达的是网络化的结构。图的应用:社交网络和地图交通网络。图的存储方式1:邻接矩阵,依赖一个二维数组,空间换时间;图的存储方式2:邻接链表,底层依赖一个链表,时间换空间。图的算法分为广度优先搜索(BFS)和深度优先搜索(DFS),主要实现在图中从一个顶点出发到另一个顶点的路径。广度优先搜索需要使用队列来实现,深度优先搜索用的是回溯思想,可以使用栈来实现的。深度优先和广度优先的时间复杂度都是 O(边的个数),空间复杂度是 O(顶点的个数)。原创 2023-06-08 17:21:18 · 1472 阅读 · 0 评论 -
数据结构与算法11:堆
堆是一个完全二叉树,对于一个堆层序遍历,从上层往下层遍历后的数据应该是有序的。大顶堆的每个节点值都大于等于子树中的节点值,小顶堆的每个节点值都小于等于子树中的节点值。堆排序可以实现O(nlogn)时间复杂度,O(1)空间复杂度。堆的常见应用:优先级队列、计算排行榜中前K个数据、求中位数、计算接口的 99% 响应时间。原创 2023-06-03 20:42:48 · 1212 阅读 · 0 评论 -
数据结构与算法10:递归树、Trie树、B+树
对于很多业务场景需要使用“二分思想”的情况下,基本上都可以拆解为二叉树这种数据结构来处理,比如归并排序、快速排序、二分查找、跳表等。归并排序的递归树是一棵满二叉树,在二分的过程中的时间复杂度是O(logn)。Trie树也叫“字典树”,它是一种专门处理字符串匹配的数据结构。B树是⼀种多叉平衡查找树,而且⾮叶⼦节点和叶⼦节点都会存储数据;B+树是只有叶⼦节点才会存储数据。原创 2023-06-02 02:15:00 · 763 阅读 · 0 评论 -
数据结构与算法09:二叉树
要存储一棵二叉树,可以选择基于指针的二叉链式存储法,也可以选择基于数组的顺序存储法。二叉树又分为:普通二叉树、满二叉树、完全二叉树、非完全二叉树等。完全二叉树的叶子节点都在最底下两层,最后一层的叶子节点都靠左排列。遍历二叉树的三种方法:前序遍历、中序遍历、后序遍历,这里的“序”指的是根节点的遍历顺序。二叉搜索树中序遍历后,可以输出一个从小到大的有序数据队列,时间复杂度是 O(n),非常高效。原创 2023-05-31 23:55:57 · 446 阅读 · 0 评论 -
数据结构与算法08:二分查找和哈希算法
二分查找是一种针对有序数据集合的查找算法,查找数据的时候每次都与区间的中间数据比对大小,将待查找的区间缩小为之前的一半,直到找到要查找的元素。二分查找的时间复杂度是O(logn),随着数据量的增大,查找的效率会很高效。哈希算法是把任意长度的原始数据通过散列算法转换成一个新的固定长度的数据输出,这个输出值就是哈希值。哈希算法常见的应用:安全加密、唯一标识、数据校验、散列函数、负载均衡、数据分片、分布式存储。原创 2023-05-31 14:20:12 · 1292 阅读 · 0 评论 -
数据结构与算法07:高效的排序算法
如果要对大规模的数据排序,可以考虑使用归并排序和快速排序,可以实现O(nlogn)的时间复杂度。归并排序和快速排序使用的是“分而治之”的思想,就是把一个无序的数组从中间分成前后两部分,然后对这两个部分再次分割,整个实现过程可以使用递归的方式。还有三种时间复杂度是O(n)的排序算法:桶排序、计数排序、基数排序,这三种排序算法时线性排序的,不涉及元素之间的比较操作。原创 2023-05-30 16:56:13 · 794 阅读 · 0 评论 -
数据结构与算法06:递归和简单的排序
递归是将一些有规律的重复问题分解为同类的子问题的方法,也就是在函数中自己调用自己。常见的排序算法有下面这些:冒泡排序、插入排序、选择排序、归并排序、快速排序、堆排序、计数排序、基数排序、桶排序。使用排序算法时需要关注三个方面:是否基于比较,是否是原地排序算法,是否是稳定的排序算法。在开发中更倾向于使用插入排序算法。原创 2023-05-30 00:23:43 · 421 阅读 · 0 评论 -
数据结构与算法05:跳表和散列表
对有序链表增加“索引”,改造后的数据结构就叫做 跳表(跳跃表),跳表的空间复杂度是 O(n),在跳表中查询任意数据的时间复杂度是O(logn),跳表中插入和删除操作的时间复杂度也是 O(logn)。散列表的本质是一个数组,可以在O(1)的时间复杂度查找元素。常用的散列冲突解决方法有两类,分别是:开放寻址法 和 链表法。散列表中装载因子越大,说明空闲位置越少,也就是冲突越多,散列表的性能会下降。原创 2023-05-29 18:25:27 · 1118 阅读 · 0 评论 -
数据结构与算法04:队列
队列主要包含两个操作:入队(在队列尾部插入一个数据)和出队(从队列头部删除一个数据) ,队列也是一种操作受限的线性表数据结构,队列可以用数组来实现,也可以用链表来实现。队列中需要定义两个指针:一个是指向队头的head 指针,另一个是指向队尾的 tail 指针。在循环队列中,最关键是要确定好队空和队满的判定条件,循环队列的入队操作和出队操作的时间复杂度都是O(1)。阻塞队列是一个 “生产者——消费者模型”。原创 2023-05-28 18:24:15 · 1738 阅读 · 0 评论 -
数据结构与算法03:栈
先进后出,后进先出的数据结构就是栈,可以理解为一个纸箱子,往箱子里面放书,一本一本叠上去,取得时候只能从上面取最后放进去的书,最早放进去的最后才会被取出来。栈只允许在一端插入和删除数据,当某个数据集合只涉及在一端插入和删除数据,并且满足后进先出、先进后出的特性,就应该首选“栈”这种数据结构。虽然栈限定降低了操作的灵活性,但这使得栈在处理只涉及一端新增和删除数据的问题时效率更高。原创 2023-05-26 22:15:00 · 782 阅读 · 2 评论 -
数据结构与算法02:数组和链表
数组是一种线性表数据结构,使用一组连续的内存空间来存储相同类型的数据;数组需要一块连续的内存空间来存储,对内存的要求比较高。链表一般分为单链表、双向链表、循环链表、双向循环链表。在链表中插入和删除数据的时间复杂度是O(1),但是链表中查找数据的时间复杂度是O(n),刚好和数组相反。可以使用链表实现 LRU 缓存淘汰算法。原创 2023-05-25 23:05:21 · 961 阅读 · 0 评论 -
数据结构与算法01:时间复杂度
不管是使用什么编程语言或者哪种数据库,不管是解决项目中的什么问题,都离不开数据结构与算法。所谓数据结构就是指某一种数据的存储结构,所谓算法就是操作这种数据的方式方法。举个生活中的例子,比如查字典,字典中的所有内容就可以理解为是一种数据结构,而如何找到想要的字就需要算法来处理。比如软件开发中常用的MySQL、Redis以及各类编程语言中都用到了大量的数据结构和算法。熟悉各类数据结构存储和算法能够编写出高效的程序代码。原创 2023-05-24 21:14:36 · 617 阅读 · 0 评论