
数据结构与算法
文章平均质量分 96
数据结构与算法专栏
利刃大大
不怕山高,只怕腿软
展开
-
【数据结构与算法】位图 && 布隆过滤器 && 海量数据问题处理 && 哈希切分
所以这个伤心的被挤走的蛋会看看自己的另一个位置有没有空,如果空了,自己挪过去也就皆大欢喜了。 我们在使用新闻客户端看新闻时,它会给我们不停地推荐新的内容,它每次推荐时要去重,去掉那些已经看过的内容。用服务器记录了用户看过的所有历史记录,当推荐系统推荐新闻时会从每个用户的历史记录里进行筛选,过滤掉那些已经存在的记录。作者提出了布谷鸟过滤器。 而至于时间问题,查找某个数字的时候,位图也是通过某个数字的对应映射关系查找的,也就是通过哈希!之后的位置也和它们一样,很明显,这时候会出现挤兑的循环。原创 2025-05-01 15:17:42 · 1035 阅读 · 0 评论 -
【数据结构与算法】跳表实现详解
skiplist是一种随机化的数据结构基于并联的链表,实现简单,插入、删除、查找的复杂度均为O(logN)大多数情况下,因为是实现上是概率问题),因为其性能匹敌红黑树且实现较为简单,因此在很多著名项目都用 skiplist来代替红黑树,例如LevelDBRocksDBRedis中的有序集合zset的底层存储结构就是用的 skiplist。 目前常用的 key-value数据结构有三种:哈希表、红黑树、skiplist哈希表:插入、查找最快,为 O(1);如使用链表实现则可实现无锁;原创 2025-04-30 14:34:51 · 1009 阅读 · 0 评论 -
【数据结构与算法】哈希表实现:闭散列 && 开散列
中,元素关键码与其存储位置之间没有对应的关系,因此在。O(N),平衡树中为树的高度,即log2n,搜索的效率取决于搜索过程中元素的比较次数。 理想的搜索方法:可以不经过任何比较,一次直接从表中得到要搜索的元素。如果构造一种存储结构,通过某种函数使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快找到该元素**。:根据待插入元素的关键码,以此函数计算出该元素的存储位置并按此位置进行存放。原创 2025-04-29 10:22:57 · 881 阅读 · 0 评论 -
【数据结构与算法】LRU Cache 算法实现
LRU) 是一种淘汰策略的缩写,意思是最近最少使用,它是一种 Cache替换算法。 什么是Cache?狭义的Cache指的是位于CPU和主存间的快速RAM, 通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术。广义上的Cache指的是位于速度相差较大的两种硬件之间, 用于协调两者数据传输速度差异的结构。除了CPU与主存之间有Cache, 内存与硬盘之间也有Cache,乃至在硬盘与网络之间也有某种意义上的Cache── 称为Internet临时文件夹或网络内容缓存等。原创 2025-04-12 19:22:15 · 1064 阅读 · 0 评论 -
【数据结构与算法】并查集的实现与应用
这道题其实如果我们把上面的并查集实现直接贴上去的话,解决起来就非常方便,因为这道题要求省份的数量,其实就是求并查集的个数嘛,所以直接有并查集的实现的话,直接遍历这个矩阵将值为1的下标加入同一个集合,其他的话就单独为一个集合,这样子就能求出一共有多少省份了~但是一般我们要去实现并查集的话,稍微会浪费点时间,其实有了并查集的思想,我们可以直接使用这个思想来完成而没必要去搭建一个完整的并查集!来存放我们的下标(负数的话代表是根,绝对值代表集合的个数),然后我们这里需要一个 findroot。原创 2025-04-09 09:35:40 · 965 阅读 · 0 评论 -
【数据结构与算法】图的最短路径算法实现:Dijkstra && Bellman-Ford && Floyd-Warshall
最短路径问题:从在带权有向图 G中的某一顶点出发,找出一条通往另一顶点的最短路径,最短也就是沿路径各边的权值总和达到最小。 Dijkstra算法是用来解决单源最短路径的算法,即在一个图中找出一个点N,找出以该点为起点到其他所有点的最短路径。但是如果想找到两个顶点A和C之间的最短路径时,Dijkstra算法可能同时找到到达其它顶点(例如顶点B)的最短路径,这一点将在算法演示的时候详细解释。同时 Dijkstra算法无法适用于含有负权重的图。O(V^2)原创 2025-03-18 13:58:08 · 1241 阅读 · 0 评论 -
【数据结构与算法】最小生成树算法实现:Prim && Kruskal
连通图中的每一棵生成树,都是原图的一个极大无环子图,即:从其中删去任何一条边,生成树就不再连通;中取出权值最小的一条边 ( 若有多条任取其一 ) ,若该边的两个顶点来自不同的连通分量,则将此边加入到 G。算法也是常用的最小生成树算法。 两种算法其实在效率是差不多的,只不过实现的方式是不一样的,具体问题具体分析!来判断,每次将选择的边对应的邻接顶点加入到并查集中,然后每次新增边的时候。 具体实现的时候,由于考虑到每次都要选最小的一条边,那这里就用。,不断地加入新的不构成环路的最短边来构成最小生成树。原创 2025-03-15 15:09:43 · 1130 阅读 · 0 评论 -
【数据结构与算法】图的概念 && 邻接矩阵实现 && 邻接表实现 && DFS && BFS
邻接矩阵和邻接表是相辅相成的,各有优缺点,要根据实际情况进行选择,有时候也可以一起使用他们进行搭配! 一般情况下,对于稠密图,我们选择邻接矩阵;对于稀疏图,我们选择邻接表! 下面我们讲解各种算法的时候,采用的是邻接矩阵来实现,因为一般我们在做oj以及实现一些算法的时候,邻接矩阵会用的比较多~原创 2025-02-18 10:04:30 · 1084 阅读 · 0 评论 -
【数据结构与算法】红黑树的插入与删除详解
我们这里只实现红黑树的插入和删除,了解他们的底层即可,而后面我们在介绍map以及set的模拟实现的时候,我们就会进一步将红黑树进行改造!enum ColorBLACK,RED, _kv(kv){}// 节点的左孩子// 节点的右孩子// 节点的双亲(红黑树需要旋转,为了实现简单给出该字段)// 节点的键值对Color _col;// 节点的颜色 后面我们在实现map和set的时候,我们会对节点定义进行一些改变,这些具体后面会讲!原创 2025-02-13 10:49:34 · 1204 阅读 · 0 评论 -
【数据结构与算法】AVL树的插入与删除实现详解
之前对 mapmultimapsetmultiset其底层都是按照二叉搜索树来实现的,但是二叉搜索树有其自身的缺陷,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N),因此mapset等关联式容器的底层结构是对二叉树进行了平衡处理,即采用平衡树来实现。注意:因为 map和 set主要是用红黑树进行封装,所以这里的 AVL树我们主要是实现它的插入和删除和 operator[](因为 insert就是为了 operator[]原创 2025-01-31 11:31:26 · 1248 阅读 · 0 评论 -
【数据结构与算法】九大排序算法实现详解
直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。 实际中我们玩扑克牌时,就用了插入排序的思想。原创 2025-01-27 09:55:30 · 1849 阅读 · 0 评论 -
【数据结构与算法】二叉树的非递归遍历算法实现详解(常见面试题)
我们怎么实现迭代遍历呢?还能像递归一样递归左右子树吗,显然不太行!所以我们这里又给了一个。 有了前序遍历做铺垫就好理解了,中序也就是在前序的基础上改动了一点!这里我们主要讲一下迭代版本的前中后序遍历,其他的放到刷题笔记中去!而这里面最重要的一点就是如何让右子树已经知道自己被访问过了? 后序的情况就相对来说。原创 2025-01-25 12:42:54 · 842 阅读 · 0 评论 -
【数据结构与算法】二叉搜索树的CRUD实现与应用详解
对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,即结点越深,则比较次数越多。现在其实指向的是同一块空间,程序没有崩溃的原因是因为我们也没有自己写析构函数来释放空间,一旦写了就会奔溃,所以我们是有必要自己来写拷贝构造以及赋值重载的!那能否进行改进,不论按照什么次序插入关键码,都可以使二叉搜索树的性能最佳?来解决了这个问题,这里子类的节点就是父类的左右子树的别名!树和红黑树,他们是平衡搜索树,用来解决这种最坏的情况,使时间复杂度控制在。原创 2025-01-25 12:37:02 · 892 阅读 · 0 评论 -
【数据结构与算法】二叉树概念与实现详解 && 堆的实现 && TOPK问题
设二叉树的根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。由于现在大家对二叉树结构掌握还不够深入,为了降低大家学习成本,此处手动快速创建一棵简单的二叉树,快速进入二叉树操作学习,等二叉树结构了解的差不多时,我们反过头再来研究二叉树真正的创建方式。 删除堆是删除堆顶的数据,将堆顶的数据根最后一个数据一换,然后删除数组最后一个数据,再进行向下调整算法。原创 2025-01-20 09:19:20 · 840 阅读 · 0 评论 -
【数据结构与算法】顺序表与链表详解
给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。给定一个带有头结点 head 的非空单链表,返回链表的中间结点。在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。新链表是通过拼接给定的两个链表的所有节点组成的。编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前。的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。给定一个链表,返回链表开始入环的第一个节点。原创 2025-01-17 11:03:11 · 634 阅读 · 0 评论 -
哈夫曼树构建、编码、译码C++实现
这里就不仔细讲哈夫曼树的原理了,资料很多,网上和书籍都是有的,主要讲一下如何实现构建哈夫曼树和编码译码的操作!做这个实验也是花了半天的功夫,等到做完发现其实最难的不是实现,而是难在你要选用什么数据结构去搭建这个哈夫曼树以及编码译码,这个流程下来这个选用的数据结构是很重要的,决定着你的算法是如何的!我用的是实现的,数据结构方面选用了、、、,其实不用也可以,完全可以自己弄个结构体也行的,但是已经学过表示万岁 O(∩_∩)O!原创 2022-11-15 10:34:08 · 2646 阅读 · 0 评论