数据结构
文章平均质量分 74
zsiming
Why do we fall?
展开
-
动态开点线段树(C++实现)
所谓懒标记,就是把本区间一些增加的量给保留下来,等到需要用到左右结点的时候,才把这些增加的量分给左右孩子,让它们去更新自己区间的值。首先,当需改修改的区间包含了当前的区间,那么我们更新了当前结点的值,然后马上返回了。很明显,这道题就是在制定某个形成区间前,查一下这个区间是不是有安排了(有的话这个区间的和大于1,没有的话等于0,每次制定一个行程区间都是为这个区间的所有元素+1)。每个结点都是维护了一个区间的性质(在上图里面表示一个区间的和),区间的最小长度为1,也就是这个区间有且仅有一个元素。原创 2022-09-10 21:02:50 · 936 阅读 · 2 评论 -
LRU算法学习笔记:实现以及应用
所谓LRU(Least Recently Used)就是最近最少使用算法。其核心的思想就是根据每个节点的最后一次访问事件来对每个结点进行排序。最近一次使用的排在队头,依次类推。原创 2022-09-07 22:24:40 · 542 阅读 · 0 评论 -
有向图、无向图相关数据结构
最近面试的公司是做地图业务相关的,可能在路径规划、路径搜索方面会涉及图相关的知识,因此趁着这个机会把图相关的知识补充整理一下。如果对图进行大分类的话,主要可以分为有向图和无向图。所谓有向,指的就是从A点到点B这条路径是成立的,而从点B到点A这条路径不一定成立。而无向图的话,从A可以到B的话,意味着也可以从B到A。邻接矩阵、邻接表、十字链表、邻接多重表。1. 邻接矩阵来表示图的话比较直观。可以根据每一行来判断每一个顶点出度对应的终点在哪,根据每一列可以判断每一个顶点的入度的起点是谁。原创 2022-08-20 16:20:18 · 1650 阅读 · 0 评论 -
C++ 优先级队列(运用绑定器实现大小根堆)
但是,对于大根堆来说,每个节点的父节点是需要大于它的孩子节点的。刚插入的、放在叶子节点中的这个节点可能比它的夫节点还要大,因此需要进行。对于出堆,首先需要记录数组的第一个元素(相当于堆顶元素)的值,然后用最后一个值覆盖第一个元素。对于入堆,一开始其实把入堆的元素放到数组的最后面。放在最后的这个元素在二叉树里面相当于就在叶子结点中。这时新的堆顶元素不一定能符合父节点大于两个孩子节点的条件,因此需要进行。中,其实是使用大小根堆实现的(默认是大根堆)。绑定了一根函数对象来自定义的实现大小根堆。...原创 2022-08-18 08:58:55 · 375 阅读 · 0 评论 -
海量数据TopK问题
可以使用大根堆来实现。迭代数据,在迭代过程中,堆里面维护了目前为止的遇到的前K个重复次数最小的元素。迭代完成时,取出即可。大根堆的调整为O(logk)的时间复杂度,k为大根堆的层数。因此是常量时间,可以去掉。只剩下O(n)的遍历元素的时间。从海量数据中找出出现次数最少的前K个值,且算法复杂度为O(n)。...原创 2022-07-23 15:55:34 · 237 阅读 · 0 评论 -
海量数据查重问题一网打尽:哈希表、位图、布隆过滤器
在面试的时候可能经常会问道海量数据的查重问题,大概就是在有限的内存空间中进行数据的查重。在实际场景中,哈希表、位图、布隆过滤器都能发挥自己作用。1.哈希表使用的内存是最多的。在使用哈希的表过程中,需要一大块连续的内存空间。而且内存空间一般是存储元素的两倍。2.位图在某些情况下大大压缩了哈希表的使用空间。在使用的过程中,位图其实也需要开辟一段连续的内存空间,但是因为其数据底层用一个位来表示一个key的状态,极致的压榨了空间的利用率。但是一个位往往只能表示”是“、”否“这两个状态。...原创 2022-07-22 23:29:47 · 416 阅读 · 0 评论 -
C++ 手撕红黑树(二):删除操作
前情概述:C++ 手撕红黑树(一):节点的插入当需要删除的节点颜色是黑色时,最基本的情况如下所示:情况1,兄弟是黑色的,而且有一个红色的右孩子:情况2,兄弟是黑色的,但是右孩子是黑色的,而左孩子是红色的:情况三:兄弟的孩子都是黑色的总结一下:3. 整棵红黑树的实现5.测试结果...原创 2022-07-11 21:47:29 · 547 阅读 · 3 评论 -
C++ 手撕红黑树(一):插入操作
红黑树的出现主要是用来解决AVL树旋转次数过多的问题。AVL树在插入节点或者删除节点的过程中(每层递归完回溯时)都需要检查左子树或者右子树之间的高度差是否小于等于1,如果不平衡(大于1)的话需要旋转或者平衡操作来维持平衡,因此在数据量比较大的时候可能旋转了很多次(接近logn次),效率比较差。而红黑树在插入和删除的时候,最多做两次旋转操作。因此旋转次数比较少。然而,值得注意的是,红黑树是一颗BST树但并不是一颗平衡的树。......原创 2022-07-11 11:10:26 · 516 阅读 · 3 评论 -
C++ AVL树手撕代码实现
AVL树是为了解决BST(二叉搜索树)树在一些情况下树的形状退化成线性链表而诞生的一种树。它有着BST树的特点(中序遍历是顺序的),但是有新的特点:因此,AVL树是高度平衡的二叉搜索树。为了保持平衡,在四种情况下,树的结构要进行变形。这四种情况分别为:在发生上面四种情况时,则需要变形操作。变形的操作分为左旋和右旋。下面是四种情况的示意图:2.2 右旋2.3 左平衡(左旋+右旋)2.4 右平衡二、AVL树的实现AVL树的重点在于操作。3.删除操作在找到需要删除的节点后,可以分为三种情况原创 2022-07-01 20:45:54 · 395 阅读 · 0 评论