- 博客(23)
- 收藏
- 关注
原创 跳表(skip list)代码实现,以洛谷P3369普通平衡树检验
建议了解一下std的random库,不是C语言的rand()和srand()。我的代码仅仅是大佬的代码做略微修改。
2024-01-22 18:49:43
486
原创 树上启发式合并(dsu on tree)
这题也可以用莫队解决,只是需要先dfs一遍进行线性化而已,还是上面一样的判断方法,判断的时间复杂度为O(1),整体时间复杂度为O(n*根号n),可以通过本题。唯一需要注意一点的是,为了操作方便可能还要多存一个dfx表示时间戳x的原来的节点编号。原因:假设存在一个颜色出现的次数不等于c,那么必然 c*f < size[x],这与c*f==size[x]矛盾,所以假设不成立。思想很简单:大的向小的上面合并,根据轻重链的性质可以证明时间复杂度缩减为O(nlogn)具体证明可自行搜索。
2024-01-22 18:43:47
480
原创 树的重链剖分
假设节点x时间戳为t,以x为根的子树节点个数为node_count,由于时间戳的区间性和时间戳的单调性,我们知道这个子树的时间戳范围为 [t,t+node_count-1],这样我们可以直接利用。利用重链时间戳的连续性,可以记录下 top[x] 表示一个节点所在重链的起点,然后快速跳跃,实现快速的查询和修改:时间复杂度:O(logn)具体证明可搜索。难点在于从节点x到节点y的最短路径这条链上的查询和修改,如果暴力,显然时间复杂度是O(n),因为题目所给树是一个链是一个很方便的卡时间方法。
2024-01-22 18:29:47
423
原创 稳定排序,MergeSortWithoutBuffer
排序有很多种,std::sort采用了quicksort+heapsort+insertsort的组合,但是这个排序是不稳定的,不能保证相同元素的原始的相对位置,即使insertsort是稳定的。
2024-01-14 20:09:54
392
原创 std::sort的底层实现
通过上面的源码,我们知道了sort实际上使用了三种排序方法:heap_sort,quick_sort,insert_sort。观察快排的循环,会发现快排使用了while循环降低了递归深度,可以进行一次模拟,这个和红黑树中的 M_erase,M_copy函数不谋而合(可以看我的红黑树课设。)而且,函数对快排进行了深度的限制,即:__lg(last-first)*2,一旦超过这个深度,那么快排停止,如果剩余元素大于15则使用heap_sort进行排序,不然,则使用insert_sort进行排序。
2024-01-14 16:11:42
568
原创 大二数据结构课设总结--无向图的关节点问题
【问题描述】对无向连通图,若删除某个结点使其成为非连通图,则称该结点为关节点。假设某一地区公路交通网,求解关节点。【设计要求】设计求解无向连通图关节点的模拟程序。(1)采用邻接表或邻接矩阵存储结构。(2)可以随机、文件及人工输入数据。(3)采用深度优先遍历求解关节点。(4)实现关节点的查询和统计功能。(5)实现将关节点改造为非关节的功能。(6)其它完善性或扩展性功能。
2024-01-14 15:55:36
504
2
原创 大二数据结构课设总结--红黑平衡二叉树的实现及其应用
我的要求是,给出排名x,如果x在size()范围内,则给出对应迭代器,否则返回end()。这段代码写的不是很优美。while (y!else在学习了find函数,upper函数,lower函数之后这个函数就显得游刃有余。while(y!else。
2024-01-14 15:35:11
957
原创 01Trie树 以及 m进制Trie 用于平衡树问题洛谷P3369 桶排洛谷P1177
今天写突然想起来01Trie和平衡树有很多相似之处,所以尝试了一下搓一个,写过了洛谷P3369,因为01Trie常数较小,所以时间还是比较快的,差不多和红黑树一致。这里因为题目的原因,没有必要写value,但其实01Trie可以用来写成一个 类型的map(其中type表示任意类型。)这个时候,01Trie类似于一个B+树,只有最低端的叶子节点有value值,其他的节点只有key值,因此,可以把叶子结点和非叶子节点定义成两种不同的结构体。为什么说和B+树有些像呢?
2023-11-29 22:03:08
451
原创 手搓平衡树:一颗B-树,一颗AVL树,一颗RB树,一颗Splay树,一颗带旋Treap,一颗无旋fhq-Treap,一颗01Trie
平衡树锦集:AVL树,红黑树,B-树,带旋Treap,无旋fhq-Treap,Splay树的全代码实现,除B-树外的洛谷P3369验证。
2023-11-15 22:33:57
493
原创 洛谷 U264950 3D打印 一道折磨我很久的题目
刷LeetCode的时候看到了一个求助题,发现洛谷上有这个题目,想着不难开始尝试....然后就有了这篇文章。
2023-10-19 20:26:35
169
2
原创 链表/单链表 O(nlogn)排序
第一个想法:用quicksort,带头尾指针的双链表确实可以,但是效率不优,因为在选择pivot的时候只能选择最左端,很容易退化成冒泡,更别说单链表了压根就不能用了。第二个想法:嗯嗯嗯....这种问题肯定前人已经解决过了。解析的很清晰,用的是非递归的mergesort,我这里只是用单链表进行了实践。splice(): 因为只需要用到第一个节点,所以我这里只要了首节点。用C++ list库,然后写一行 .sort() 再看定义。内存是merge的硬伤,但是时间已经和数组的sort逼近了。
2023-10-14 14:12:30
139
原创 [蓝桥杯 2019 国 B] 第八大奇迹
第二:可以看到是固定只查询第八大,可以考虑线段树维护前八大即可。pushup用归并排序。第一:静态区间查询第八大第一个想法肯定是主席树,但是太麻烦了,这里略过不提。
2023-10-13 19:28:08
102
原创 LeetCode接雨水i 两种思想四种解法。
第三:我们发现这里的查询都是从端点出发的查询,很具有规律性,那么我们可以考虑存储对于每一个柱子来说左边的最大值和右边的最大值。第二:ST表或者线段树:既然是RMQ问题,那么可以考虑ST表或者线段树,实现O(logn)查询。法一:以一个柱子为视角,一块地方有雨水等价于后面有一个的柱子的高度大于等于本身的高度。用的是单调栈的思想。第一:双指针,从本身出发,然后更新左边最大值,从右边出发,更新右边最大值。法二:从一个柱子的贡献度考虑,一个柱子贡献的积水量等于min(左边最大的柱子,右边最大的柱子)-本身高度。
2023-10-13 19:18:53
70
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人