![](https://img-blog.csdnimg.cn/20200216231233631.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法
对数据结构与算法进行系统的讲解与分析,对必要的知识点的应用予以分析
_为光
我生有涯愿无尽
展开
-
【数据结构与算法】-> 社群分享
社群分享Ⅰ 前言Ⅱ 链表Ⅲ 位运算Ⅰ 前言这篇文章的缘起,是我参加的极客大学算法训练营,要做一次社群分享,这篇文章作为底稿,大致梳理一下我想要分享的两个部分:位运算和链表。由于现在时间有限,只先梳理一个大概的总结,在后面的文章中我会将这三个部分以及其他模块比如BFS,DFS,DP,二分,贪心等等补充详细。基础知识补充在我的数据结构与算法已经发出的相关文章中,相关力扣题的整理再单独发出。Ⅱ 链表链表是数据结构里最最基础的一个结构,之所以想跟大家分享这么基础的东西,是因为链表的很多题是挺有趣的,我刚开始原创 2020-12-22 21:37:39 · 1611 阅读 · 6 评论 -
【数据结构与算法】->算法-> A* 搜索算法->如何实现游戏中的寻路功能?
A* 搜索算法Ⅰ 前言Ⅱ 算法解析Ⅲ 如何实现游戏寻路问题Ⅳ 总结Ⅰ 前言你可能玩过魔兽世界,仙剑奇侠和英雄联盟这类 MMRPG 游戏,在这些游戏中,有一个非常重要的功能,就是人物角色自动寻路。当人物处于游戏地图中的某个位置的时候,我们用鼠标点击另外一个相对较远的位置,人物就会自动地绕过障碍物走过去。那么这个功能是如何实现的呢?这篇文章我们就来探索一下这个功能。Ⅱ 算法解析实际上,这是一个非常典型的搜索问题,人物的起点就是他当下所在的位置,终点就是鼠标点击的位置。我们需要在地图中,找一条从起点到终点原创 2020-09-22 20:36:19 · 796 阅读 · 0 评论 -
【数据结构与算法】->数据结构-> B+ 树->如何实现 MySQL 数据库索引
B+ 树Ⅰ 前言Ⅱ 算法解析① 需求分析② 二叉查找树的演化Ⅰ 前言我们在使用数据库的时候,为了加速数据库中数据的查找速度,我们常用的处理思路是,对表中数据创建索引。那么,数据库索引是怎么实现的呢?它的底层使用的是什么数据结构和算法?这篇文章我们就来研究一下这个问题。Ⅱ 算法解析① 需求分析首先,我们先思考一个问题,就是数据库要解决什么问题,有哪种需求。我们这里只思考两个最常用的需求:根据某个值查找数据,比如 SELECT * FROM user WHERE id = 123;根据区间值来查原创 2020-09-22 07:30:44 · 341 阅读 · 0 评论 -
【数据结构与算法】->算法->地图软件的最优路线是如何计算的?
最短路径算法Ⅰ 前言Ⅱ 一些基本分析Ⅲ 迪杰斯特拉算法(Dijkstra)A. 原理及实现B. 时间复杂度C. Dijkstra 算法在实际开发中的优化Ⅰ 前言在我前面的文章中,我讲了两种图的搜索算法,深度优先搜索和广度优先搜索。这两种算法主要针对的是无权图,也就是说每个顶点到其他顶点的距离都一样的,都是 1。【数据结构与算法】->算法->深度优先搜索&广度优先搜索针对有权图,也就是图中的每条边都有一个权重,我们该如何计算两点间的最短路径(经过的边的权重和最小)呢?这就引出了我们这篇文章的内原创 2020-09-20 20:14:50 · 3542 阅读 · 3 评论 -
【数据结构与算法】->算法->拓扑排序->如何确定代码源文件的编译依赖?
拓扑排序(Topological Sorting)Ⅰ 前言Ⅱ 拓扑排序算法解析A. Kahn 算法B. DFS 算法Ⅰ 前言我们一般写程序的时候,一个完整的项目往往会包含很多代码源文件,编译器在编译整个项目的时候,需要按照依赖关系,依次编译每个源文件。比如 a.java 依赖 b.java,那在编译的时候,编译器需要先编译 b.java,才能编译 a.java。原来我写 C 语言的程序的时候,经常要用到联合编译,当时我们运行程序都是手动在命令行上编译和运行,所以如果要联合编译而且有依赖关系,比如 a.原创 2020-09-20 08:51:45 · 1286 阅读 · 0 评论 -
【数据结构与算法】->算法->动态规划(下)->如何实现搜索引擎的拼写纠错功能?
动态规划(下)Ⅰ 前言Ⅱ 字符串相似度的量化Ⅲ 莱温斯坦距离的计算Ⅰ 前言在我前面的一篇文章 Trie 树 中我提到了搜索引擎的一个功能,关键词提示。除此之外,一般搜索引擎为了优化用户的体验,还有个拼写纠错的功能。当你在搜索框中,不小心输入错单词时,搜索引擎就会非常智能地检测出你的拼写错误,并且用对应的正确单词来进行搜索。那么,这个功能是如何实现的呢?Ⅱ 字符串相似度的量化要实现拼写纠错功能,首先要能识别两个字符串,但是计算机只认识数字,两个字符串之间的相似度要如何量化呢?有一个非常著名的量化方原创 2020-09-18 11:21:46 · 675 阅读 · 0 评论 -
【数据结构与算法】->算法->动态规划(中)->详解动态规划理论
动态规划(中)Ⅰ 前言Ⅱ 一个模型三个特征A. 一个模型B. 三个特征1. 最优子结构2. 无后效性3. 重复子问题Ⅲ 一个特征三个模型实例解析Ⅳ 两种动态规划解题思路总结A. 状态转移表法B. 状态转移方程法Ⅴ 四种算法思想比较分析Ⅵ 小总结Ⅰ 前言在上一篇文章中,我通过几个例子讲述了动态规划的思想,这篇文章我们再回到动态规划的基本概念中,带你搞清楚最优子结构,无后效性和重复子问题。【数据结构与算法】->算法->动态规划(上)->初识动态规划->怎么精准地帮助女朋友薅羊毛Ⅱ 一个模型三个特征什么原创 2020-09-18 00:05:33 · 417 阅读 · 0 评论 -
【数据结构与算法】->算法->动态规划(上)->初识动态规划->怎么精准地帮助女朋友薅羊毛
动态规划(上)Ⅰ 前言Ⅱ 0-1 背包问题Ⅲ 0-1 背包问题 PlusⅠ 前言淘宝的双十一大家相比都经历过,双十一里有很多满减活动,比如“满 200 元减 50 元”。假如你的女朋友的购物车中有 n 个(n > 100)想买的商品,她希望能从里面选出来几个,在凑够满减条件的前提下,选出来的商品价格总和最大程度地接近满减条件(200 元),这样就可以极大限度地“薅羊毛”。作为程序员的你,能不能换个女朋友?奥不对,能不能写个代码帮她搞定这件事呢?要想高效地解决这个问题,就要用到这篇文章要讲的动态规原创 2020-09-17 10:13:51 · 1085 阅读 · 1 评论 -
【数据结构与算法】->算法->回溯算法
回溯算法Ⅰ 前言Ⅱ 回溯算法的理解Ⅲ 回溯算法的经典应用A. 0-1 背包B. 正则表达式Ⅳ 总结Ⅰ 前言在前面讲深度优先搜索算法的时候,我说其实深度优先搜索算法利用的就是回溯算法思想。【数据结构与算法】->算法->深度优先搜索&广度优先搜索这个算法思想非常简单,但是应用非常广泛。它除了用来指导像深度优先搜索算法这种经典的算法设计之外,还可以用在很多实际的软件开发场景中,比如正则表达式匹配、编译原理中的语法分析等。除此之外,很多经典的数学问题都可以用回溯算法解决,比如数独、八皇后、0-1原创 2020-09-16 00:27:25 · 317 阅读 · 0 评论 -
【数据结构与算法】->算法->分治算法->MapReduce的基本思想
分治算法原创 2020-09-15 09:55:34 · 574 阅读 · 0 评论 -
【数据结构与算法】->算法->贪心算法
贪心算法(Greedy Algorithm)Ⅰ 前言Ⅱ 贪心算法的理解Ⅲ 贪心算法实战分析1. 分糖果2. 钱币找零3. 区间覆盖Ⅳ 生活中的贪心算法Ⅰ 前言贪心算法(Greed Algorithm)的思想其实是生活中一个很常用的思想,贪心算法本身也有很多经典的应用,比如哈夫曼编码(Huffman Coding)、Prim 和 Kruskal 最小生成树算法、Dijkstra 单源最短路径算法。最小生成树和最短路径在我后面的文章中会介绍,哈夫曼编码在我之前的文章中也讲过了,今天我们再从贪心算法的角度来看原创 2020-09-15 00:54:32 · 477 阅读 · 0 评论 -
【数据结构与算法】->算法->AC自动机->敏感词过滤功能要如何实现?
AC 自动机Ⅰ 前言Ⅱ 用 Trie 树实现敏感词过滤Ⅲ AC 自动机原理及实现Ⅳ 敏感词过滤系统的实现Ⅰ 前言很多支持用户发表文本内容的网站或者软件,大都会有敏感词过滤功能,用来过滤掉用户输入的一些淫秽、反动、谩骂等内容,这个功能是怎么实现的呢?其实,这些功能的最基本的原理就是字符串匹配算法,也就是通过维护一个敏感词的词典,当用户输入的一段文字后,通过字符串匹配算法,来查找用户输入的这段文字,是否包含敏感词,如果有,就用 * 把它替代掉。我在之前的文章中,讲过很多种字符串匹配算法,它们都可以处理这原创 2020-09-14 22:12:59 · 1086 阅读 · 0 评论 -
【数据结构与算法】->数据结构->Trie树->如何实现搜索引擎的关键词提示功能?
Trie树Ⅰ 前言Ⅱ Trie 树的原理Ⅲ Trie 树的实现Ⅳ Trie 树的执行效率Ⅴ Trie 树与散列表、红黑树的比较Ⅵ 如何实现搜索引擎的关键词提示功能Ⅰ 前言大家肯定都用过搜索引擎,应该对下面的情形很熟悉了????我们在搜索框输入内容的时候,搜索引擎会根据关键词猜测你要搜的是什么,然后给你提示。这就是一般搜索引擎都有的搜索关键词提示功能。你可以直接从下拉框中选择你要搜索的东西,而不用把所有内容都输入进入,这在一定程度上就节省了我们的时间。并且我们知道,在我们增加或更改输入的内容,下拉框里原创 2020-09-14 00:34:17 · 505 阅读 · 0 评论 -
【数据结构与算法】->算法->字符串匹配基础(下)->KMP 算法
字符串匹配基础(下)—— KMP 算法Ⅰ 前言Ⅱ KMP 算法基本原理Ⅲ 失效函数计算方法Ⅳ KMP 算法代码实现Ⅴ KMP 算法复杂度分析Ⅰ 前言在前两节中,我详细讲了字符串匹配的三个算法,BF,RK 和 BM 算法,BM 算法可以说是这三个包括这篇要讲的 KMP 算法里最难最复杂的,也非常不好理解。但是 BM 算法却是工程中非常常用的一种高校字符串匹配算法。有统计说,它是最高效、最常用的字符串匹配算法。但是,在所有的字符串匹配算法中,要说最知名的一种,那肯定是非 KMP 算法莫属。很多时候,提到字符原创 2020-09-13 19:00:51 · 405 阅读 · 0 评论 -
【数据结构与算法】->算法->字符串匹配基础(中)->BM算法->KMP 三倍性能的强大算法
字符串匹配基础(中)—— BM算法Ⅰ 前言Ⅱ BM 算法核心思想Ⅲ BM 算法原理分析1. 坏字符规则2. 好后缀规则Ⅰ 前言文本编辑器的查找替换功能相信大家都不陌生,很多 IDE 像 Eclipse,IntelliJ,包括 Word,都有这个功能,把一个词统一替换成另一个。那这个功能是如何实现的呢?如果用前一篇文章里的 BF 算法和 RK 算法,当然可以实现这个功能,但是在某些极端情况下,BF 算法性能会退化得比较严重,而 RK 算法需要用到哈希算法,但是设计出一个可以应对各种类型字符的哈希算法并不原创 2020-09-13 15:05:59 · 1351 阅读 · 0 评论 -
【数据结构与算法】->算法->字符串匹配基础(上)->BF 算法 & RK 算法
字符串匹配基础(上)Ⅰ 前言Ⅱ BF 算法A. 原理B. 代码实现Ⅲ RK 算法A. 原理Ⅰ 前言字符串匹配这个功能,对于任何一个开发工程师来说,应该都不陌生。我们用的最多的就是编程语言中提供的字符查找函数,比如 Java 中的 indexOf(),Python 的find()等等,它们的底层就是接下来我们要说的字符串匹配算法。字符串匹配算法很多,分单模式串匹配和多模式串匹配,这篇文章我们就来说说两个相对来说比较简单、好理解的单模式串匹配,它们分别是 BF 算法 和 RK 算法。RK 算法其实相当于原创 2020-09-12 22:18:23 · 485 阅读 · 0 评论 -
【数据结构与算法】->算法->深度优先搜索&广度优先搜索
深度&广度 优先搜索Ⅰ 前言Ⅱ 什么是“搜索”算法?Ⅲ 广度优先搜索(BFS)Ⅳ 深度优先搜索(DFS)Ⅰ 前言在前一篇文章中,我讲解了图的概念以及图的表示方法,也讲了如何用无向图、有向图来表示一个社交网络。要是对图还不熟悉的同学可以先跳转去看看。【数据结构与算法】->数据结构->图这篇文章就来讲讲两个搜索算法,深度优先搜索和广度优先搜索。Ⅱ 什么是“搜索”算法?我们知道,算法是作用于具体数据结构之上的,深度优先搜索算法和广度优先搜索算法都是基于“图”这种数据结构的,因为图的表达能力很强原创 2020-09-12 12:39:06 · 1093 阅读 · 0 评论 -
【数据结构与算法】->数据结构->图
图(Graph)Ⅰ 前言Ⅱ 如何理解“图”?Ⅲ 图的存储结构A. 邻接矩阵存储方法B. 邻接表存储方法Ⅳ 图的代码实现Ⅴ 如何存储微博的好友关系Ⅰ 前言相信大家都用过微信、微博、QQ 这些社交软件中的一个,在微信和QQ中,两个人可以互相加为好友;在微博中,两个人可以互相关注。那么,我们要如何存储微信、微博这些社交网络的好友关系呢?这就要用到我们这篇文章中要讲的一个数据结构——图。实际上,涉及图的算法有很多,也非常地复杂,比如图的搜索、最短路径、最小生成树、二分图等等等等……这篇文章我们聚焦在图上,先原创 2020-09-11 22:29:52 · 511 阅读 · 0 评论 -
【数据结构与算法】->数据结构->堆(下)->堆的应用
堆的应用Ⅰ 前言Ⅱ 堆的应用一:优先级队列1. 合并有序小文件2. 高性能定时器Ⅲ 堆的应用二:利用堆求 Top KⅣ 堆的应用三:利用堆求中位数Ⅰ 前言在前一篇文章里,我详细讲解了堆的原理以及实现,也给出了一个堆的最容易想到的应用——堆排序,但实际上堆还有几个非常重要的应用,在软件开发中我们可能会经常用到,这篇文章我们就来看一看这几个应用。【数据结构与算法】->数据结构->堆(上)->详解堆&堆排序Ⅱ 堆的应用一:优先级队列首先,我们来看堆的第一个应用场景——优先级队列。优先级队列,顾原创 2020-09-11 18:10:18 · 245 阅读 · 0 评论 -
【数据结构与算法】->数据结构->堆(上)->详解堆&堆排序
堆(Heap)Ⅰ 前言Ⅱ 定义Ⅲ 堆的实现A. 堆的存储结构B. 堆支持的操作① 往堆中插入一个元素② 删除堆顶元素Ⅳ 堆排序A. 建堆B. 排序Ⅴ 堆排序与快速排序的比较Ⅰ 前言在前面的文章里,我讲了树、二叉树以及二叉树的特殊形式。这篇文章,我们再来看看另外一种特殊的树——堆(Heap)。堆这种数据结构应用的非常多,最经典的莫过于堆排序了。接下来我们就从堆的原理出发,弄清楚堆到底是什么,怎么实现,以及基于此的堆排序的实现。【数据结构与算法】->数据结构->树与二叉树Ⅱ 定义前面我们已经说到了,原创 2020-09-11 01:13:06 · 345 阅读 · 0 评论 -
【数据结构与算法】->数据结构->二叉查找树
二叉查找树(Binary Search Tree)Ⅰ 前言Ⅱ 什么是二叉查找树Ⅲ 关于二叉查找树的几个操作A. 查找B. 插入C. 删除D. 其他操作Ⅳ 二叉查找树对重复数据的处理Ⅴ 时间复杂度分析Ⅵ 散列表和二叉查找树的对比Ⅰ 前言在前面的文章里,我详细讲解了树与二叉树,也讲解了一种特殊的二叉树——哈夫曼树,这篇文章我们就来继续探讨另一种特殊的二叉树:二叉查找树。二叉查找树最大的特点就是,支持动态数据集合的快速插入、删除以及查找操作。Ⅱ 什么是二叉查找树二叉查找树是二叉树中最常用的一种类型,也叫二原创 2020-09-10 16:47:13 · 461 阅读 · 0 评论 -
【数据结构与算法】->数据结构->树与二叉树
树与二叉树Ⅰ 树(Tree)A. 树的概念B. 树的表达形式(存储结构)C. 树的遍历a. 广度优先遍历(队列)b. 深度优先遍历(堆栈)Ⅱ. 二叉树(Binary Tree)A. 二叉树的有关概念B. 二叉树中相关公式C. 二叉树的存储结构① 链式存储法② 顺序存储法D. 二叉树的遍历Ⅲ 总结Ⅰ 树(Tree)A. 树的概念树状图是一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特原创 2020-09-10 00:15:50 · 348 阅读 · 0 评论 -
【数据结构与算法】->数据结构->散列表(下)->散列表和它的好朋友链表
散列表(下)Ⅰ 前言Ⅱ LRU 缓存淘汰算法Ⅲ Redis 有序集合Ⅳ Java LinkedHashMapⅤ 为什么散列表经常要和链表一起用?Ⅰ 前言关于散列表的基本思想我在前两节中已经讲完了,有兴趣的同学可以跳转过去看看。这篇文章我想说一对组合。【数据结构与算法】->数据结构->散列表(上)->散列表的思想&散列冲突的解决【数据结构与算法】->数据结构->散列表(中)->工业级散列表的设计熟悉数据结构的同学们可能会发现,散列表和链表经常会放在一起使用。在链表的讲解中,我提到了 LRU原创 2020-09-09 19:41:00 · 229 阅读 · 0 评论 -
【数据结构与算法】->数据结构->散列表(中)->工业级散列表的设计
散列表(中)Ⅰ 前言Ⅱ 如何设计散列函数Ⅲ 如何处理装载因子过大Ⅳ 如何避免低效的扩容?Ⅴ 如何选择冲突解决方法?1. 开放寻址法2. 链表法Ⅵ 工业级散列表分析1. 初始大小2. 装载因子 & 动态扩容3. 散列冲突解决办法4. 散列函数Ⅶ 如何设计一个工业级的散列表?Ⅰ 前言在散列表(上)中我介绍了散列表的思想和基本内容,我们知道,散列表的查询效率并不能笼统地说成是 O(1),它和散列函数、装载因子、散列冲突等都有关系。如果散列函数设计得不好,或者装载因子过高,都可能导致散列冲突发生的概率升原创 2020-09-09 16:44:26 · 186 阅读 · 0 评论 -
【数据结构与算法】->数据结构->散列表(上)->散列表的思想&散列冲突的解决
散列表(上)Ⅰ 散列思想Ⅱ 散列函数Ⅲ 散列冲突A. 开放寻址法B. 链表法Ⅳ 如何实现单词拼写检查功能Ⅰ 散列思想散列表的英文叫 “Hash Table”,我们平时也叫它 “哈希表” 或者 “Hash 表”。散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,有数组演化而来。可以说没有数组的话,就没有散列表。这里我用一个例子来说明散列思想。假如学校开运动会,一共有 72 名运动员参赛。为了方便比赛成绩的记录,每个运动员的胸前都会贴上自己的参赛号码,从 1 到 72。原创 2020-09-09 00:39:16 · 391 阅读 · 0 评论 -
【数据结构与算法】->数据结构->跳表
跳表Ⅰ 前言Ⅱ 如何理解跳表Ⅲ 用跳表查询到底有多快Ⅳ 跳表的内存损耗Ⅴ 高效的动态插入和删除A. 插入B. 删除Ⅵ 跳表索引动态更新Ⅶ 为何 Redis 要用跳表?Ⅷ 代码实现Ⅰ 前言在我之前的一篇文章里,我详细讲了二分查找,在文中我提到,二分查找底层依赖的是数组随机访问的特性,所以只能用数组来实现。如果数据存储在链表中,就真的没办法用二分查找算法了吗?【数据结构与算法】->算法->二分查找实际上,我们只需要对链表做一个小改造,就可以支持类似“二分”的查找算法。我们把改造之后的数据结构叫做跳表(S原创 2020-09-08 21:34:38 · 2628 阅读 · 0 评论 -
【数据结构与算法】->算法->二分查找
二分查找Ⅰ 前言Ⅱ 无处不在的二分思想Ⅰ 前言这篇文章我将详细分析一种针对有序数据集合的查找算法:二分查找(Binary Search) 算法,也叫 折半查找算法。二分查找的思想非常简单,但是看似越简单的东西往往越难掌握。唐纳德·克努特(Donald E.Knuth)在《计算机程序设计艺术》的第三卷《排序和查找》中说道:“尽管第一个二分查找算法于 1946 年出现,然而第一个完全正确的二分查找算法实现直到 1962 年才出现。”所以千万不要小看了二分查找,我将会带领大家由浅入深地去探究一下这个算法。原创 2020-09-08 17:39:10 · 1179 阅读 · 0 评论 -
【数据结构与算法】->算法->排序(四)->排序优化->如何实现高性能的通用排序函数
排序(四)Ⅰ 前言Ⅱ 如何选择合适的排序算法Ⅲ 如何优化快速排序Ⅳ 举例分析排序函数Ⅰ 前言前面三节,我已经把基本的排序算法都讲完了,第四节作为一个总结,分析一下排序算法的优化。【数据结构与算法】->算法->排序(一)->冒泡排序&插入排序&选择排序【数据结构与算法】->算法->排序(二)->归并排序&快速排序【数据结构与算法】->算法->排序(三)->线性排序->桶排序&计数排序&基数排序几乎所有的编程语言都会提供排序函数,比如 C 语言中 qsort(原创 2020-09-07 23:24:52 · 171 阅读 · 0 评论 -
【数据结构与算法】->算法->排序(三)->线性排序->桶排序&计数排序&基数排序
排序(三)Ⅰ 前言Ⅱ 桶排序(Bucket Sort)A. 原理B. 适用场景C. 代码实现Ⅲ 计数排序(Counting Sort)A. 原理B. 适用场景C. 代码实现Ⅳ 基数排序(Radix Sort)A. 原理B. 适用场景C. 代码实现Ⅰ 前言再次把之前的表拿出来。排序算法就剩最后三个要讲啦。前面两节可以跳转下面两篇文章去看????【数据结构与算法】->算法->排序(一)->冒泡排序&插入排序&选择排序【数据结构与算法】->算法->排序(二)->归并排序&快速排原创 2020-09-07 22:12:03 · 252 阅读 · 0 评论 -
【数据结构与算法】->算法->排序(二)->归并排序&快速排序
排序(二)Ⅰ 前言Ⅱ 归并排序(Merge Sort)1. 详解2. 归并排序稳定性3. 归并排序时间复杂度4. 归并排序空间复杂度Ⅲ 快速排序(Quicksort)1. 详解2. 快速排序稳定性3. 快速排序时间复杂度4. 快速排序空间复杂度Ⅳ 补充1. 归并排序和快速排序的区别2. O(n) 时间复杂度内求无序数组中的第K大元素Ⅰ 前言在排序(一)中,我给了一个表第二节我们就来看看时间复杂度为 O(nlog2n) 的两个算法,归并排序以及快速排序。第一节的排序可以从下面的链接跳转过去。【数据结原创 2020-09-07 17:16:11 · 377 阅读 · 0 评论 -
【数据结构与算法】->算法->排序(一)->冒泡排序&插入排序&选择排序
排序(一)Ⅰ 前言Ⅱ 如何分析一个“排序算法”A. 排序算法的执行效率1.最好情况、最坏情况、平均情况时间复杂度2.时间复杂度的系数、常数、低阶3.比较次数和交换(或移动)次数B. 排序算法的内存消耗C. 排序算法的稳定性Ⅲ 冒泡排序(Bubble Sort)1. 详解2. 冒泡排序内存消耗3. 冒泡排序稳定性4. 冒泡排序时间复杂度① 有序度② 逆序度5. 拓展-直接交换排序Ⅳ 插入排序(Insertion Sort)1. 详解2. 插入排序内存消耗3. 插入排序稳定性4. 插入排序时间复杂度5. 拓展-原创 2020-09-07 00:55:25 · 633 阅读 · 0 评论 -
【数据结构与算法】->数据结构->链表->LRU缓存淘汰算法的实现
链表Ⅰ 链表与数组Ⅱ 链表结构链表在缓存的应用Ⅰ 链表与数组相比数组,链表是一种稍微复杂一点的数据结构。这两个非常基础,非常常用的数据结构,我们常常会放到一起来比较。所以我们先来看看,这两个数据结构有什么区别。从底层的存储结构上看,数组在我的上一篇文章里已经讲过,申请的空间是连续的,对内存的要求比较高。如果我们申请一个大小为 100MB 的数组,当内存的连续存储空间没有 100MB ,就会申...原创 2020-04-11 21:24:13 · 521 阅读 · 0 评论 -
【数据结构与算法】->数据结构->数组
数组Ⅰ 前言Ⅱ 数组的定位A. 线性表B. 连续存储空间 & 相同数据类型a. 插入操作b. 删除操作c. 随机访问Ⅲ 数组下标为什么要从0开始?Ⅳ 容器能否完全代替数组?Ⅰ 前言提到数组,大家想必都很熟悉,因为这是编程早期最先学的一个数据结构。大家可能会觉得十分简单,但是就是因为简单,可能很多人都没有掌握数组的精髓。事实上,在每一种编程语言中,基本都会有数组这种数据类型。比如在P...原创 2020-03-26 16:59:19 · 603 阅读 · 0 评论 -
【数据结构与算法】->详解时间复杂度和空间复杂度
时间复杂度&空间复杂度Ⅰ 前言Ⅱ 为什么需要复杂分析度分析?——事后统计法的局限性局限一:测试结果依赖测试环境局限二:测试结果受数据规模影响Ⅲ 大 O 复杂度表示法Ⅳ 时间复杂度分析① 只关注循环执行次数最多的一段代码② 加法法则③ 乘法法则Ⅴ 几种常见的时间复杂度实例分析① O(1)② O(logn) & O(nlogn)③ O(m + n) & O(m * n)Ⅵ 空间...原创 2020-03-25 22:06:23 · 883 阅读 · 1 评论 -
【数据结构与算法】->数据结构->队列->循环数组的应用&队列工具库的创建
队列Ⅰ 队列的定义Ⅱ 队列的实现A. 普通数组的不合理之处B. 循环数组的应用Ⅰ 队列的定义队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列的特点:先进先出。堆栈的特点:先进后出。Ⅱ 队列的实现队列有两种实现的方法...原创 2020-03-02 11:05:49 · 434 阅读 · 0 评论 -
【C语言->数据结构与算法】->洗牌算法->如何生成一组不重复的随机数
洗牌算法Ⅰ 洗牌算法介绍Ⅱ 如何生成范围内的随机数A. srand()B. rand()C. time()D. 如何将随机数控制在一定范围内E. 生成一定范围内的随机数的代码实现Ⅲ 洗牌算法思想Ⅳ 洗牌算法的代码实现Ⅰ 洗牌算法介绍洗牌算法应用于我们需要生成一组不重复的全随机数的情况,就像一副牌,我们发出去是不会有重复的,在发之前把这副牌洗了,这样发出去的牌既是不重复的,也是随机的,这就是洗牌...原创 2020-02-20 11:51:53 · 1384 阅读 · 0 评论 -
【C语言->数据结构与算法】->哈夫曼压缩&解压缩->终局->如何做一个自己独有的压缩软件
哈夫曼压缩&解压缩Ⅰ 前言Ⅱ 需求分析&主函数带参的应用A. 需求分析B. 压缩部分B. 解压缩部分Ⅲ 哈夫曼压缩A. 代码分析B. 从文件中读取内容生成频度表C. 将编码写入文件D. 哈夫曼压缩完整代码E. 运行结果Ⅳ 哈夫曼解压缩A. 代码分析B. 从压缩文件中读取频度表C. 解码D. 哈夫曼解压缩完整代码E. 运行结果Ⅴ 一些补充Ⅰ 前言在之前的文章里,我先介绍了如何构造...原创 2020-02-19 16:30:06 · 697 阅读 · 5 评论 -
【数据结构与算法】->数据结构->哈夫曼树->哈夫曼编码&解码
文章目录Ⅰ 树A. 树的概念B. 树的表达形式(存储结构)C. 树的遍历a. 广度优先遍历(队列)b. 深度优先遍历(堆栈)Ⅱ. 二叉树A. 二叉树的有关概念B. 二叉树中相关公式C. 二叉树的存储结构Ⅲ 哈夫曼树及编码A. 构造哈夫曼树a. 频度统计b. 生成哈夫曼树B. 哈夫曼编码C. 解码Ⅰ 树由于树的应用场合很少,不是很实用,所以在此只做简单介绍。A. 树的概念树状图是一种数据结...原创 2020-02-19 11:10:10 · 1666 阅读 · 1 评论 -
【C语言->数据结构与算法】->关于主函数带参
这篇文章会简单介绍一下关于主函数的参数。在Sublime中,当你敲int main时直接回车会出现以下代码????int main(int argc, char const *argv[]){ /* code */ return 0;}(int argc, char const *argv[])即为主函数的参数。主函数的参数个数只能是两个,且类型只能int 和 char **。第...原创 2020-02-18 10:13:19 · 832 阅读 · 0 评论 -
数据结构与算法——专栏索引篇
前言数据结构与算法在编程里是很重要的一个环节,走过这条路,就算是入了编程的门了。并且数据结构与算法的思想在各个编程语言中都能用到,是编程中重要的思想锻造历程。我在我的博客中,会用C语言讲解数据结构与算法中的重要知识点,不仅是因为C语言是基础,更是因为C语言的多变性,而且C语言是较为复杂的,我们需要自己手动去实现很多东西,不像Python,Java,很多东西已经在那里了,我们是得不到充足的锻炼...原创 2020-02-16 19:09:09 · 3055 阅读 · 0 评论