数据结构与算法
文章平均质量分 73
本专栏将为大家逐步更新有关数据结构与算法的内容
就要 宅在家
New git new get
展开
-
跳表SkipList介绍与实现
跳表是一种随机化数据结构,主要用于快速检索数据。实质上是一种可以进行二分查找的有序链表。时间复杂度可以达到O(log^n)。在性能上与红黑树、AVL树相当。当然因为结构具有随机性,最坏情况下时间复杂度为O(n)。跳表结构如下图:与普通链表相比,跳表每个结点有不止一个指向后续的指针,具体数量是随机出来的。这些指针结构上从低到高排列,指向后面与自己同层的指针所在的结点。检索数据时,从head结点开始,按指针从高到低的所指元素大小进行比较,直到找到或走到结尾。原创 2023-01-07 00:00:00 · 1125 阅读 · 2 评论 -
B树的原理及代码实现、B+树和B*树介绍及应用
B树主要用于磁盘文件的检索操作。众所周知,平衡二叉树(AVL树、红黑树)搜索的时间复杂度是O(log^n)。虽然很快,但如果数据在磁盘中且有上亿量级的数据,即便只有30次左右的IO操作,速度也是非常慢的。因为磁盘IO速度极慢,主要是寻道操作影响,平均8ms左右。因此,磁盘数据的检索不适合使用平衡二叉树,B树正式上线。B树可以看成是压缩版的平衡二叉树,每一个节点上都有保存有多个值,且有多个叶子节点。一般而言,B树的检索次数在个位量级,这取决于每个节点上能保存多少个值。原创 2023-01-03 08:15:00 · 2135 阅读 · 6 评论 -
如何处理海量数据文件以及大文件数据查找
同样,一个数据只会映射一个比特位,在两个位图中会映射同样的比特位,这两个比特位正好可以用于记录数据出现的次数。数据第一次映射时置为0 1,第二次为1 0,第三次为1 1。如果是40亿个数据,最多就需要40亿个比特位,即476MB。当找寻数据时,只需要在位图中找到该数据对应的比特位,如果为1说明有,0说明没有。当然,前提是数据进文件时就已经建立位图了,否则查找时再建立位图还是要遍历数据。这时一个位图已经无法满足需求,因为一个位图只能通过0和1判断数据是否存在。不管是哪种,面对40亿个数据其效率都不会太高。原创 2022-11-18 18:45:00 · 1576 阅读 · 6 评论 -
手把手教你实现红黑树
手把手教你实现AVL树、平衡二叉树红黑树是在1972年由发明的。其特点是从根到叶子节点的所有路径中,最长路径不大于最短路径的2倍。可以说红黑树是AVL树的plus版,因此,红黑树查找时间与AVL树相同,都为O(log N)。同时,红黑树没有做到AVL树那种绝对平衡,因此其旋转次数少于AVL树。当数据量大时,其效率要优于AVL树。正因如此,在实际应用中往往采取红黑树而非AVL树。原创 2022-11-12 15:15:00 · 2399 阅读 · 3 评论 -
手把手教你快速排序(递归)
众所周知,选择、冒泡排序的时间复杂度是O(n^2),而所谓的快速排序,时间复杂度只有O(n*logn),那什么是快速排序呢,下面就跟着小编一起来探究吧!(点赞更新非递归方法哦😬)目录一.排序原理二.代码实现三.拓展一.排序原理假设有一串无规律的数字,现在需要我们把它从小到大依次排好,根据快速排序的原则,我们可以这样进行:1.随便找出一个数a,比它小的在它左边,大的在它右边,不管是左边还是右边都不需要有序排好。2.在a的左边再找一个数b,a的右边找一个数c,b和c重复1.的原创 2022-03-10 11:14:38 · 3269 阅读 · 19 评论 -
手把手教你快速排序(非递归)
今天小编带大家学习快速排序的非递归方法,当然这篇博客是基于大家已经掌握了快排的递归方法的,如果还有不会的童鞋,可以看看下面这篇博客呦~:手把手教你快速排序(递归)一.实现原理首先我们需要一个栈。我们知道,快速排序就是一个递归加分治的思想,在递归方法里,我们是把数列分成两部分,每个部分又分成两部分,直到不能再分为止。所以我们可以用一个栈来存放数列两部分的头尾,排一次就让头尾出来,再把分好的两部分的头尾分别再入栈,再排再出,再入,直到不能再分成两部分为止。原理图:二.代码实...原创 2022-03-17 16:53:33 · 2680 阅读 · 9 评论 -
手把手教你归并排序(递归)
今天,小编继续带大家学习排序算法,这次我们一起来学习归并排序的递归算法,多多点赞支持博主,速更非递归算法哦!目录一.实现原理二.代码实现三.注意事项与缺点一.实现原理归并算法的实现与快排类似,都是采用了分治递归的思路。它的时间复杂度也是O(n*logn)。但不一样的是,快排是从排序最上层开始一点点递归到最底层;而归并是通过递归直接到最底层,从最底层开始一步步返回到最上层。我们拿int类型的排序举例,归并来到最底层之后,应该是两个数字一组进行比较,从小到大排好,之后回.原创 2022-03-28 15:16:59 · 3946 阅读 · 17 评论 -
手把手教你归并排序(非递归)
今天,我们一起来学习归并排序的非递归算法吧!目录一.优势二.实现原理三.代码实现一.优势 相比于递归算法,归并排序的非递归算法不用多次调用同一个函数,不会向递归算法一样因为函数嵌套调用次数太多而造成栈溢出。二.实现原理 其实,相比于递归的算法,非递归与之不同点就一个:在递归中我们通过递归到最底层(即两个数一组)进行排序,而非递归则是直接把数组分成两个数一组进行排序,这边排序完之后,再把数组分成四个一组排序,直到整个数组被分成两组,排序后就结束。...原创 2022-04-04 19:53:57 · 5100 阅读 · 23 评论 -
带头双向循环链表基础知识归纳
本节博主将归纳带头双向循环链表的初始化,头尾插和头尾删首先让我们一起瞅瞅这链表长啥样:(图像来源:图解几种常见的线性表 - 命中水 (cxiansheng.cn))在这张图中我们能够得出一个双向循环链表所需要的结构体基本框架:struct node{ intdata;//装的数据,我们这里默认int类型 struct node*prev;//指向前一个节点 struct node*next;//指向后一个节点};一. 初......原创 2021-12-28 20:31:43 · 501 阅读 · 3 评论 -
利用哈希来解决问题
在力扣题解中,我们经常能够看到哈希的身影。今天,让我们一起来探寻哈希的算法思路吧。原创 2022-07-15 10:05:49 · 272 阅读 · 7 评论 -
手把手教你外排序
排序总体来说分为两类,数据在内存中的叫做内排序,数据存在磁盘的叫外排序。一般而言,磁盘中存放的都是大型数据,所以,外排序主要是应用于磁盘中大型数据的。一.排序思想对于外排序而言,因为待排的数据往往远大于内存容量,所以在排序时通常将数据切分,切分成能在内存中排序的大小,将分成的小块依次在内存中排好序后按归并的思路进行整合即可。我们这里举例子说话:假设我们有一组100G的数据,已知内存最多存放20G,那么我们把这100G的数据切分成5份,每份20G。将每份数据排序后依次放入新创建的文档中。注意:此时所有的数据依原创 2022-07-08 16:52:33 · 1106 阅读 · 5 评论 -
手把手教你基数排序
说到基数排序,个人认为这是一种非常神奇的排序方式。在小编初次了解它时,就被他魔幻的排序方式所折服。一.排序思路小编喜欢生动一点的讲解方式,大家请跟着小编的思路,一起探究一下吧,首先让我们假设有一组数:这里共有10个数,最大的989共有三位,所以我们比较到百分位即可,即遍历三次。首先假定我们准备10个桶。第一步,按个位存放 ,依次拿出。存放方式与哈希桶类似。比如32的个位是2,那么32就放入下标为2的桶中。如果有数放入同一个桶中,那么就按队列存放,确保先入先出。 之后,按下标将数据依次拿出,桶中有多个数据的先原创 2022-07-07 16:03:45 · 383 阅读 · 5 评论 -
计数排序基础思路
所谓计数排序,也可以称为散列表 。也是一种简单的哈希桶。今天,小编带大家来了解计数排序的基本思路。以升序为例,计数排序通俗来讲,分为三个步骤。首先制作包含所有要排序的数的桶(相同的数制作一个桶即可)。以2,3,6,1,4,1,2,3,7,6,8,9,5,4,3举例,就是制作9个桶,分别代表1,2,3,4,5,6,7,8,9。第二步, 把所有的数依次放入桶中,桶中的数字代表该数有多少个。 第三步,从小到大依次把桶中的数全部拿出来。排序完成。小编希望大家自主实现一下代码,难度不大,相信自己!ps:桶可以用数组下原创 2022-07-05 10:16:29 · 279 阅读 · 11 评论 -
实现哈夫曼树和哈夫曼编码
原谅小编做了只鸽子,鸽了这么久😅哈夫曼树在日常生活中可以用于文件的压缩,所以是我们程序员必不可少的基本功,下面跟着小编我一起来实现哈夫曼树和编码吧!一.哈夫曼树的实现(一).实现原理哈夫曼树是一种特殊的二叉树我们先假设有一个森林,里面是一堆数据,有大有小,杂乱无章(类似数组)哈夫曼树是先取森林中最小的两个值放入两个节点(值称为权值),权值相加放入另一个节点中(双亲节点),双亲的左右子树存放这两个子树的下标,两个子树的双亲存放双亲节点的下标。注意:哈夫曼树没有用指针的方式指向双亲/原创 2022-03-06 11:08:18 · 1794 阅读 · 17 评论 -
图的介绍和邻接矩阵、邻接表的创建(以有向图为例)
小编满血复活,更新力度感人~先让我们看看有向图长什么样吧有向图是指节点与节点之间连线是有方向性的。一.图的介绍图分为有向图和无向图。图由许多的节点组成,这些节点我们称为顶点。有向图是指顶点之间的指向有方向性,顶点之间用<x,y>表示;无向图的顶点之间没有单一的方向,是双向的 顶点之间用(x,y)表示。对于两个相互连接的(不论有无方向性)顶点,它们互称邻接点。度,分为入度和出度,入度是指指向该顶点的边个数,出度是指从这个顶点出去的边的个数,入度和出度相加就是原创 2022-03-08 15:05:27 · 3471 阅读 · 22 评论 -
学懂最小生成树(普里姆算法)
最小生成树,初学者可能会学的感觉云里雾里,不要怕,小编带大家搞懂它!一.概念介绍最小生成树就是在一个图中找到能过一次性穿过所有顶点的最小路径。上图!!!就是所有权值相加最小的一种路线,叫最小生成树今天,让我们一起用普里姆算法实现它吧!二.实现原理普里姆算法是基于邻接矩阵实现的1.首先,我们需要一个结构体数组,结构体元素是该图顶点的元素和到该顶点权值,我们叫它普里姆数组吧(这是小编自己这样叫的,感觉好理解一些😂)。普里姆数组中存放的实际上是2.进行普里姆数组的初始化原创 2022-03-15 16:16:17 · 2389 阅读 · 14 评论 -
学懂最小生成树(克鲁斯卡尔算法)
本节,小编将带大家了解最小生成树的第二种构成算法——克鲁斯卡尔算法(Kruskal algorithm)当然,对另一种算法感兴趣的朋友可以看看之前的这篇文章:学懂最小生成树(普里姆算法)目录一.实现原理二.代码实现一.实现原理克鲁斯卡尔算法的思想是:将所有边从小到大排序,然后依照边从小到大将顶点链式连接起来,直到所有的顶点连成一条链。原理图:CSDN@就要宅在家二.代码实现实现克鲁斯卡尔算法,我们需要准备两个“工具”,一是结构体数组,里头存放边和该边的两...原创 2022-03-18 11:45:59 · 556 阅读 · 20 评论 -
详细实现最短路径(迪杰斯特拉算法)
最短路径,说白了,就是图里从一个顶点到另一个顶点的最小权值之和。今天,小编带大家一起用迪杰斯特拉(Dijkstra)算法实现它吧!一.实现原理其实,在小编看来,迪杰斯特拉算法与普里姆算法有些异曲同工之妙,建议大家可以先看看学懂最小生成树(普里姆算法)这篇文章,这样更有利于理解迪杰斯特拉算法。回到正文,迪杰斯特拉算法其实是一种贪心算法。其原理是从起点顶点(源点)出发,确定其到每个顶点的最短路径,直到确定到终点顶点(终点)为止,此时从顶点开始确定的这条路径就是最短路径。...原创 2022-03-19 21:18:28 · 3076 阅读 · 18 评论 -
超详细讲解实现拓扑排序、关键路径
今天,小编带着大家来学习图中非常重要的一环,拓扑排序和关键路径!首先,我们需要知道的是,拓扑排序是关键路径的基础,正因如此,当我们知道了关键路径在生活中的应用,相信大家也就明白这两个算法的重要性了!...原创 2022-03-26 18:54:55 · 6072 阅读 · 22 评论 -
完全理解搜索/排序/查找二叉树的插入、查找、删除
这种二叉树名字太多了!小编这里统一叫做搜索二叉树了。首先让我们看看搜索二叉树长什么样子:一.插入(一).实现原理(二).代码实现一.插入(一).实现原理(二).代码实现一.插入(一).实现原理(二).代码实现...原创 2022-03-30 22:08:25 · 1144 阅读 · 14 评论 -
手把手教你实现AVL树、平衡二叉树
今天,小编带大家一起来学习平衡二叉树(AVL树)吧。以下就简称AVL树了。想必能点开这篇博客的朋友都是极度深爱计算机的,那今天就让我们一起揭开AVL树的神秘面纱吧!目录一.基本概念二.实现原理(一)插入左子树①插入左子节点②插入右子节点(二)插入右子树①插入右子节点②插入左子节点(三)左旋转(四)右旋转三.代码实现一.基本概念AVL树得名于它的发明者G. M. Adelson-Velsky和E. M. Landis。AVL树是搜索二叉树的一原创 2022-04-07 17:39:45 · 1691 阅读 · 16 评论