▲ 数据结构&算法
文章平均质量分 83
本专栏详细讲解《数据结构》中各种数据类型的功能特性及优缺点,如链表、队列、栈、图、树等等。每篇文章都穿插了大量的示意图,图文并茂,尽量使文章通俗易懂,简单明了。并且还附加了完整的代码,遵循“拿来即可用”原则,避免因伪代码而给读者带来学习上的阻碍。此外,本专栏也会详细而全面地讲解常见的排序、查找算法。
优惠券已抵扣
余额抵扣
还需支付
¥19.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
内核之道
某大厂资深技术专家,精通PostgreSQL内核、专注于『NVR、AI超脑、智能应用服务器』开发
展开
-
【007】 二分查找算法(Binary Search)
文章目录1. 二分搜索算法2. 算法思想1. 二分搜索算法二分搜索算法也称为“折半查找”,它是一种高效的查找技术,用于搜索已排序(升序或降序)数组中的键(key)。在每次迭代中,其搜索范围减少一半,这就是它为什么被称为“二分搜索”算法的由来。二分搜索算法属于区间搜索算法的范畴,可以应用于已排序的二叉树、已排序的线性数组、指针数组。当数组中有大量元素时,它很有用。与线性搜索算法相比,该算法具有更高的效率。二分搜索只适用于已排序的数据结构。该算法的时间复杂度为O(Logn^nn)。2. 算法思想该算法原创 2021-11-24 00:39:47 · 3454 阅读 · 0 评论 -
【008】 2-3树(一)
文章目录1. 2-3树介绍2. 2-3树3. 1. 2-3树介绍2-3树又被称为2-3阶梯树,它是由美国计算机科学家JohnHopcroftJohn HopcroftJohnHopcroft于197019701970年提出。它是一种可以有两种节点的树,即:2-节点(2 node)和3-节点(3 node)。如下图所示:一个2-节点包含一个键KKK和2个子节点,左边的子节点充当键小于KKK的子树的根,右边的子节点充当键大于KKK的子树的根。换句话说,该2-节点和经典的二叉搜索树中的节点相同。一个3-原创 2022-01-06 14:50:32 · 379 阅读 · 1 评论 -
【008】Linux2.6 完全公平调度算法(CFS)
文章目录1. 概述2. Linux调度器的简史3. CFS概述4. CFS内部结构5. CSF和优先事项1. 概述Linux调度器在竞争压力下是一个有趣的研究。一方面是应用Linux的使用模型。虽然Linux最初是作为桌面操作系统的实验开发的,但现在您可以在服务器、微型嵌入式设备、大型机和超级计算机上找到它。毫不奇怪,这些域的调度负载是不同的。另一方面是在平台上取得的技术进步,包括架构(多处理、对称多线程、非均匀内存访问[NUMA])和虚拟化。这里还包含了交互性(用户响应性)和整体公平性之间的平衡。从这原创 2022-01-05 11:58:14 · 1127 阅读 · 3 评论 -
【009】 二叉搜索树 Binary Search Trees(二)
文章目录1. 二叉搜索树2. BST搜索2.1 BST中最大/最小元素3. BST 插入4. BST 删除1. 二叉搜索树二叉搜索树(Binary Search Trees)的相关理论知识和概念在《二叉搜索树(一)》一文中有做过介绍,本文作为扩展。二叉搜索树(BST)是一种特殊的二叉树,其中任意一个节点的左子树的所有节点的值都小于该节点的值。同样,任何节点的右子树的所有节点的值都大于该节点的值。在上图中,第二棵树不是二叉搜索树,因为左子树的所有节点的值都不小于右子树的所有节点。顾名思义,二进制翻译 2021-12-29 00:57:26 · 144 阅读 · 10 评论 -
【010】输入一个单向链表,输出该链表中倒数第K个节点
文章目录1. 题目2. 分析2.1 方法一2.1 方法二3. 代码1. 题目输入一个单单向链表,输出该链表中倒数第K个节点。链表的倒数第0个节点为链表的尾指针。2. 分析2.1 方法一想必大家第一时间想到的是先遍历该单向链表,获取到该链表中节点的总数(假定是N);然后再一次从头到尾遍历该单向链表,直到N -K -1位置处(题目指定从0开始)。然后我们可以得出其代码如下://// 顺序遍历单向链表void SeqTraversal(const LinkNode *HLNode, const i原创 2021-12-22 15:40:55 · 960 阅读 · 1 评论 -
【011】有一个文件,文件里面的内容是一个JSON对象,该JSON对象由若干个json对象组成,其中每个json对象有一个唯一的key,使用指针依次解析出每个json对象的key和value
文章目录1. 描述2. 解决思路3. 代码1. 描述本地磁盘上面有一个名为test.txt的文件,该文件中的内容是一个JSON对象。然后该JSON对象是由若干个以不同关键字key和value构成的JSON对象组成。如下所示:{ "key1": {}, "key2": {}, "key3": {}, "key4": {}}现在需要解析出该test.txt文件中的各JSON对象的key和value。这里有一个难点是:每个json对象的关键字key不一样,因此,不能通过常规解析工具(比如cJS原创 2021-12-20 19:58:21 · 130 阅读 · 0 评论 -
【012】求 1+ 2 + 3 + . . . +n的和,要求不能使用乘除法、for、while、if、else、switch和case等关键字以及判断语句
文章目录1. 题目2. 思路3. 代码实现1. 题目求1 + 2 + 3 + ... +n的和,它通常是作为初学者的一个练习示例;如果使用for、while等循环或乘除法去实现,则较为简单。例如使用循环:/// 使用循环实现int i = 1;int sum = 0;for(; i <= 100; i++){ sum += i;}除了采用循环的方式外,我们还可以采用高斯公式来计算(借助乘除法)。如下:sum = (1 + n) * n /2;而现在要求是不采用乘除法和循环。原创 2021-12-20 16:43:47 · 114 阅读 · 0 评论 -
【013】翻转句子中单词的顺序
文章目录1. 题目2. 思路1. 题目翻转给定句子中单词的顺序,但是单词内字符的顺序保持不变。句子中各单词以空格符分隔,标点符号可视为普通字符一样处理。比如对于给定字符:I'm a programmer.输出:programmer. a I'm2. 思路...原创 2021-12-20 14:14:44 · 240 阅读 · 0 评论 -
【014】二元查找树转换为排序的双向链表
文章目录1. 题目描述1. 题目描述创建一棵二元查找树(也可称为二叉搜索树、二叉查找树 ),然后将该二元查找树转换成一个排序的双向链表。注意: 要求不能创建新任何新的节点,只调整指针的指向。比如当前二元查找树如下图所示:转换为双向链表之后为:...原创 2021-12-20 10:05:56 · 454 阅读 · 1 评论 -
【015】 双向链表实现日志记录框架库
文章目录1. LWlogc简介1.1 LWlogc特性1.1 lwlog.properties 配置文件1.1.1 lwlog.File1.1.2 lwlog.MaxBackupIndex1.1.3 lwlog.MaxFileSize1.1.4 lwlog.Threshold2. LWlogc代码架构2.1 LWlogc日志记录库布局图2.2 LWlogc服务启动流程2.3 使用LWlogc2.4 LWlogc内存、cpu占用3. LWlogc依赖库1. LWlogc简介 L原创 2020-08-20 12:45:49 · 780 阅读 · 0 评论 -
【016】 深度优先搜索算法(Depth First Search, DFS )
文章目录1. 定义2. 实现1. 定义在计算机科学中,树遍历(也称为树搜索或遍历树)是图遍历的一种形式,它指的是访问(例如检索、更新或删除)树数据结构中的每一个节点,恰好一次过程。这种遍历按照访问节点的顺序进行分类。在 树(二叉树) 一文中,我们提到过,根据访问根(root)节点的顺序的不同,可分为:先序遍历、中序遍历和后序遍历。如下图所示,其中红色圆点表示先序、绿色表示中序、蓝色表示后序。其实上面这三种(先序、中序和后序)访问树的方式均属于我们本节将重点讲解的“深度优先搜索算法(Depth原创 2021-11-28 14:26:11 · 307 阅读 · 0 评论 -
【017】 二叉搜索树 Binary Search Trees(一)
文章目录1. 定义2. 搜索3. 插入4. 删除1. 定义二叉搜索树(Binary Search Tree, BST)又称为“二叉查找树”,它是一种二叉树,具有以下特点:① 若它的左子树不为空,则该左子树上所有节点的值都小于根节点的值。② 若它的右子树不为空,则该右子树上所有节点的值都大于根节点的值。二叉搜索树的属性是递归的:如果我们将任何节点视为“根(root)”,则这些属性将保持为真(true)。由于二叉搜索树中的节点排序方式,按(中序)顺序遍历(左节点,然后是根节点,然后是右节点)将始终原创 2021-11-28 13:46:04 · 268 阅读 · 0 评论 -
【018】 冒泡排序算法
1.冒泡排序 其基本思想:每次都将相邻的两个数进行比较,将小的数调到前面。在这里,我将用一个int型数组,来进行分析讲解。定义一个int型数组,包括6个元素,这里之所以用6个元素是为了使分析的步骤和过程更加的清晰简单明了。如:int array[6] = {8,4,12,5,7,9};这里是第一趟比较后的结果,通过5次的比较后,该数组中的最大元素12已经沉到最低端了。原创 2016-08-10 13:33:38 · 319 阅读 · 0 评论 -
【020】链表(创建、插入、删除、输出链表等)
实现功能,根据提示: 输入1:创建一个新链表; 输入2:插入链表 输入3:删除链表 输入0时:自动退出程序。#include<stdio.h>#include<stdlib.h>typedef struct Slink { long long int data; struct Slink *next; }slink;int main()原创 2016-10-29 11:03:18 · 857 阅读 · 0 评论 -
【021】经典算法40题
经典算法40题 (答案我会抽时间写在这上面)【1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? //典型的Fibonacci数列 (也可以用递归来实现,更简单) //只计算了数列前30个数#include<stdio.h>#include<stdlib.h>#inclu原创 2016-12-07 12:46:16 · 592 阅读 · 0 评论 -
【022】GeoHash算法的c实现
char *GeoHash::geohash(double lng, double lat, char *buf, int bits){ uint64_t lngLatBits = 0; double lngMin = -180; double lngMax = 180; double latMin = -90; double latMax = 90;原创 2017-07-14 10:49:02 · 674 阅读 · 0 评论 -
【023】水仙花数算法
一 水仙花数 所谓的水仙花数是指:一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身。例如153,370,371,407等都是水仙花数,就拿153来说,153=1*1*1 + 5*5*5 + 3*3*3. 满足上面的条件就是水仙花数,否则不是。在编写代码的过程中,重点是如何分解,如何表达出数字中的个位,十位,百位等。在这里定义三个整型(int)变量:int i,原创 2016-08-10 21:54:29 · 21470 阅读 · 6 评论 -
【024】数据结构之顺序表1
“数据结构”对于编程而言,具有着不可替代的作用。在编程书中,经常看到这样一个等式: 程序 = 数据结构 + 算法 由此可以看淡数据结构是非常之重要的。但是相对而言,数据结构中的知识点让人难以琢磨,比较费脑力。数据结构:是由数据和结构两部分组成。其中“数据”部分是指数据元素的结合;结构就是关系,“结构”部分就是指数据元素之间关系的集合。所以说,数据结构是指:数据原创 2016-10-30 12:27:14 · 377 阅读 · 0 评论 -
【025】数据结构之顺序表2
顺序表上的基本操作:1.初始化一个线性表(即创建一个空的线性表L)void initlist(sqlist *L){ L->data=(ElemType *)malloc(sizeof(ElemType));//存储空间的基地址 L-length = 0; //长度为0 L->listsize = INITSIZE; //当前的容量为初始量}2.求表长操作(计算出顺序表L中的全部元原创 2016-10-30 21:58:37 · 427 阅读 · 0 评论 -
【026】 二叉树转换为双向链表
文章目录1. 二叉树转换为双向链表1. 1 二叉树节点数据类型声明1. 2 示例代码1. 二叉树转换为双向链表1. 1 二叉树节点数据类型声明 在 数据结构 · 树(二叉树) 一文中,详细的概述了二叉树的各种分类与特性,同时也用数组(顺序存储)方式来实现了二叉树的存储与遍历。显而易见,使用数组方式实现二叉树,视树的情形不同,对内存的空间浪费也大有所异(除非该二叉树是满二叉树),并且,使用数组来实现二叉树,非常具有局限性,这与用数组实现其他数据类型(比如队列、栈等)一样。因此需要使用动态的方式原创 2021-01-18 22:17:05 · 544 阅读 · 2 评论 -
【027】 树(二叉树)
文章目录1. 二叉树1. 1 二叉树定义1. 2 二叉树图示法2. 二叉树性质3. 二叉树分类3. 1 退化二叉树(Degenerate Binary Tree)3. 2 平衡二叉树(Balanced Binary Tree)3. 3 满二叉树(Perfect Binary Tree)3. 4 完全二叉树(Complete Binary Tree)3. 5 全二叉树(Full Binary Tree)4. 二叉树遍历5. 二叉树存储6. 二叉树常见操作1. 二叉树1. 1 二叉树定义 在一棵原创 2020-12-15 22:58:37 · 281 阅读 · 0 评论 -
【028】 树(概念篇)
文章目录1. 前言1.1 为何引入树数据结构2. 树3. 术语3.1 树的度3.2 节点的度3.3 叶子节点3.4 深度3.5 高度3.6 父亲节点(父节点)3.7 孩子节点(子节点)3.8 兄弟节点3.9 节点的层次3.10 堂兄弟节点3.11 子孙3.12 节点的祖先3.13 森林点4. 树的种类4.1 无序树(自由树)4.2 有序数4.2.1 二叉树4.2.1.1 完全二叉树4.2.1.2 满二叉树4.2.1.3 平衡二叉树(AVL)4.2.1.4 排序二叉树(BST)4.2.2 B树4原创 2020-12-08 00:21:30 · 217 阅读 · 0 评论 -
【029】 栈(链式存储)
文章目录1. 链表栈2. 链表栈实现2.1 链表栈节点类型声明2.2 链表栈操作2.2.1 初始化栈2.2.2 入栈2.2.3 弹栈2.2.4 获取栈顶元素2.2.5 判栈空2.2.6 遍历栈2.2.7 获取栈大小3. 完整示例代码1. 链表栈 在 《数据结构 · 栈(顺序存储)》 章节里,详细讲解了栈的功能特性,以及常见操作。同时还使用顺序存储(数组或是指针变量)的方式来实现了栈的功能。但是使用数组来模拟/实现栈,具有局限性及低效性,因为它只对固定数量的数据值有效。这也就意味着,在实现栈的原创 2020-12-05 10:39:57 · 319 阅读 · 4 评论 -
【031】 队列(链式存储·循环队列)
文章目录1. 概述1. 概述 在《数据结构·队列(链式存储,C实现)》一节,讲解了使用单链表方式来实现队列的功能。本节将着重描述如何使用单链表方式来实现循环队列。 ...原创 2020-12-03 12:26:04 · 1013 阅读 · 0 评论 -
【032】 队列(顺序存储)
文章目录1. 队列2. 队列操作3. 循环队列1. 队列 队列是一种使用较为广泛的线性表,即同类型的数据元素的有序集合。它的特性与栈不同,插入与删除发生在两个极端;一端用来进行元素插入,另外一端用来进行元素删除。和栈刚好相反,队列是一种先进先出(FIFO, First-In-First-Out)的抽象数据结构,先入队列的元素,将先被访问获取,后入队列的将被最后访问。队列通常用于解决各种系统资源程序,比如操作系统任务调度,就充分利用到队列的先进先出特性;又或者计算机中的某些资源共享,需遵循同步原则,原创 2020-12-03 00:25:44 · 375 阅读 · 0 评论 -
【033】 队列(链式存储)
文章目录1. 概述2. 队列的链式存储2.1 链式队列初始化2.2 入队列2.3 出队列2.4 获取队列头元素2.5 获取队列大小2.6 队列判空2.7 队列遍历1. 概述 在《数据结构·队列(顺序存储)》一文中,已详细讲解了队列的特性以及使用数组来实现队列的基本操作。队列也是属于线性表,因此,它也支持使用链表的方式来实现其先进先出(FIFO)特性。本文主要描述如何使用链式存储结构来模拟实现队列(包括循环队列链表)。 使用链式存储结构的好处是,入队列节点元素不受客观约束限制,只要内存空间足原创 2020-12-03 00:07:01 · 329 阅读 · 0 评论 -
【034】 栈(顺序存储)
文章目录1. 栈2. 栈的存储方式3. 栈的常见操作3.1 初始化栈3.2 入栈3.3. 出栈3.4 获取栈的长度3.5 判断栈空3.6 遍历栈1. 栈 栈是一种使用较为广泛的数据结构,常用在:内存管理、匹配括号、表达式求值、回溯(游戏、寻找路径、穷尽搜索)等,后面讲解编译原理时,将会用到栈数据结构。它同时也是属于一种特殊的线性表,只允许在同一端进行操作。允许操作的端(插入元素、删除元素)称为栈顶,另外一端称为栈底。位于栈顶部的元素是栈顶元素,相反,位于栈底部的元素是栈底元素。栈中的所有元素个数原创 2020-11-30 22:25:04 · 469 阅读 · 0 评论 -
【035】 链表(顺序存储)
一、前言 《数据结构》是每个程序猿都应该掌握的“必修课”。虽不及其他招式花哨、但却总能在关键时刻成为”必杀技”,给人致命一击。熟练掌握《数据结构》,能够间接、明显地提升你的编码技能与思维;同时,还能加速定位问题、解决问题的能力。“数据结构”中常见的类型有:数组、链表、栈、队列、图、树、堆和散列表。不同的数据结构类型均有自己独特的数据存储方式,以及优缺点。在擅长的方面,能够大显神威,发挥出光与热;而在不足面,则显得。原创 2020-11-28 15:17:38 · 577 阅读 · 2 评论 -
【036】 插入排序算法
文章目录1. 工作原理2. 实现3. 时间复杂度4. 空间复杂度1. 工作原理 “插入排序”算法,它与生活中的“扑克牌”紧密相关。相信玩过扑克牌的读者应该非常清楚,每次我们仅考虑一个数据(张牌),并将其插入到已排好序的扑克适当位置中。在插入该数据(扑克牌)时候,先将较大的元素一个个移到右边。我们将所有数据分为两个部分:已排序部分与未排序部分。 图片来自 HappyCoders. 通俗说:“插入排序的工原创 2020-09-01 00:17:56 · 239 阅读 · 0 评论 -
【037】 选择排序算法
文章目录1. 选择排序1.1 选择排序示意图1.2 复杂度1.3 空间复杂度2. 选择排序适用场景1. 选择排序 它是这样一种算法, 首先选出数组列表中最小的元素,并将它与数组中的第一个元素交换。然后继续找出该数组列表中次小的元素,并将它与数组中的第二个元素交换。以此类推, 直到整个数组排序完成。1.1 选择排序示意图 下图是选择排序的内部原理图。 假如现在有一个数组arr, 其元素分别如下: 5 60 3 1原创 2020-08-26 00:55:11 · 1102 阅读 · 0 评论 -
【 038】 头插法与尾插法创建链表
1、采用头插入法创建单链表的思路:首先创建一个空表,生成一个新的节点;并将读取到的数据放入新节点的数据域中,然后将该节点插入到当前链表的表头,即就是头结点之后;直到插入元素完成。2、效果:采用头插入法创建的单链表的逻辑顺序与输入的数据顺序是相反的,所以头插入法是一个逆序建表法。原理图: #include<stdlib.h>#include <stdio.h>typedef int ElemTy原创 2017-03-10 13:22:43 · 12801 阅读 · 4 评论 -
【 039】 合并两个链表
1.实现将两个带头结点的链表L1和L2进行连接,连接后的链表仍然使用原来的存储空间;结果为链表L2连接到L1的末尾。思路:找到链表L1的尾节点,使其指针域指向下一个链表的头结点(同时将链表L2所占用的内存空间进行回收)。合并之前: 合并之后: #include<stdlib.h>#include <stdio.h>typedef int ElemType;typedef struct li原创 2017-03-10 15:25:33 · 28742 阅读 · 9 评论 -
【040】 栈实现括号匹配检查
功能:主要对字符串中的括号(包括“{}”、“[]”、“()”)进行匹配;匹配成功时,打印匹配成功,否则打印匹配失败。算法思路: 从字符串的第一个字符开始扫描,若是普通字符则忽略,反之若是左符号则入栈操作;当遇见右符号的时候则从栈中弹出栈顶元素,并进行匹配;匹配结束时: 成功:所有字符扫描完毕,并且栈为空; 失败:匹配失败或所有字符扫描完毕但是栈非空;附:调试过程中,有些小问题,有时间了再修改;原创 2017-03-07 14:29:20 · 516 阅读 · 0 评论 -
【041】 单链表创建、插入、删除、遍历,打印
/****SLIST.h****/#pragma once#include <stdio.h>#include <stdlib.h>#include <string.h>#define true 1#define false 0typedef int ElemType;typedef struct Node { ElemType id; //数据域原创 2017-04-18 16:33:19 · 933 阅读 · 0 评论 -
【042】 输出链表最大值节点
/***********************************************************************新增加功能:输出链表中值的最大节点************************************************************************/ /****求链表中的值最大的节点****/void SListNo原创 2017-04-19 14:56:45 · 2613 阅读 · 0 评论 -
【043】 栈顺序存储(一)
一. 栈的概念 栈为一种可以实现“先进后出”的存储结构,凡是对数据的处理具有“后进先出(LIFO)”的特点,都可以用栈这种数据结构来操作。栈也是一个线性表,也就是说,栈元素具有线性关系,即前驱后继关系。只不过它是一种特殊的受限线性表而已。栈的特殊之处在于限制了这个线性表的插入和删除的位置,它始终只在栈顶进行。这也就使得:栈底是固定的,最先进栈的只能在栈底。二 . 栈操作 栈的插原创 2017-04-20 01:33:24 · 747 阅读 · 0 评论 -
【044】 栈顺序存储(二)
/*******************************************-------------- 顺序栈的遍历 ------------------------------- 改进:不使用变量i -----------******************************************//**** 遍历栈 ****/void ListStack(SeqS原创 2017-04-20 10:33:18 · 331 阅读 · 0 评论 -
【045】 快递管理系统(单链表)
/****** LinkList.h ******/#pragma once#include<stdlib.h>#include<stdio.h>#include<string.h>#define SIZE 40//定义链表节点数据类型struct LinkNode{ struct LinkNode *next;};//链表数据类型struct LinkList{原创 2017-05-10 19:10:38 · 10415 阅读 · 26 评论 -
【003】 动态数组
/********************************************* Function 根据需要动态分配内存空间*************************************************//*********** DyNaArray.h ****************/#pragma once#include <stdio.h>#inclu原创 2017-04-21 18:10:37 · 492 阅读 · 0 评论 -
【001】 单链表(四)
/*********************************************************说明:结构体嵌套结构体*******************************************************//*************** LinkList.h *****************/#pragma once#include<stdio原创 2017-04-21 23:28:31 · 322 阅读 · 0 评论