《数据结构》C++代码 Splay】的更多相关文章

Splay,伸展树.之所以先写这个课内并不怎么常用的数据结构,是因为本人非常喜欢Splay,我觉得这是非常有美感且灵活的一种平衡树.在此先声明,我的伸展树写法来源于CLJ大牛,基础好的同学可以去他的博客中看看他的Splay实现模板,我的实现仅仅借鉴了CLJ大神的一点实现技巧而已.我的博文<心中的大牛博客列表>中有CLJ大神的博客链接. 还有很多同学可能并不了解Splay的思想,那么可以去看sqybi的文章<The magical splay>,百度文库就可以搜索到.这篇文章是我看过…
1.BST二叉搜索树 顾名思义,它是一棵二叉树. 它满足一个性质:每一个节点的权值大于它的左儿子,小于它的右儿子. 当然不只上面那两种树的结构. 那么根据性质,可以得到该节点左子树里的所有值都比它小,右子树的都比它大. 而平衡树都是基于BST的. 为什么叫做平衡树?对于数的操作可能会破坏BST的性质,这时会进行另外的操作,保持它的性质. 为什么要用BST?对于一棵BST,每一次的操作,都相当于进行一次二分,时间复杂度可以降到log级别. 这里写的是两个常用的平衡树. 2.Splay splay树…
#0.0 写在前面 Splay(伸展树)是较为重要的一种平衡树,理解起来也依旧很容易,但是细节是真的多QnQ,学一次忘一次,还是得用博客加深一下理解( #1.0 Splay! #1.1 基本构架 Splay 是如何维护树的平衡的呢?近乎不维护...但其实能使 Splay 的形态接近平衡的原因是每一次操作后都将操作的点拉到根部(splay() 操作),这似乎是基于统计学的某个结论:这次操作过的数据很有可能还是下一次的操作目标(?)不懂欸QuQ 总之,在实践中我们可以得到这样一点:Splay 能用,…
对于n==100.1,1,2或者1,2,2大量重复的形状相同的数据,cmp函数最后一项如果表达式带等于,整个程序就会崩溃 还没有仔细分析std::sort的调用过程,所以这里不是很懂..,mark以后研究 因为题目让你挑一到两个平行六面体,然后去每个平行六面体长宽高的最小值,然后去求最小值中的最大值 我们很容易想到暴力的做法,如果两个平行六面体能够合并的话,那我们直接计算合并之后的最小值,因为我们知道此时 合并之后再求最小值,它是只增不减的 那么我们就要找到能合并某一个面的所有平行六面体的集合,…
上篇我们讲了BitMap是如何对数据进行存储的,没看过的可以看一下[算法与数据结构专场]BitMap算法介绍 这篇我们来讲一下BitMap这个数据结构的代码实现. 回顾下数据的存储原理 一个二进制位对应一个非负数n,如果n存在,则对应的二进制位的值为1,否则为0.这个时候,我们的第一个问题:我们在使用byte,int,short,long等这些数据类型在存储数据的时候,他们最小的都要占用一个字节的内存,也就是8个bit,也就是说,最小的操作单位是8个bit.根本就没有可以一个一个bit位操作的数…
现在大二正在上<数据结构>课,课内的书上代码实现很喜欢无脑用类.变量名字很长,而且常常实现太繁琐,并且代码有些无法运行,这些对于老手无所谓,但初学者看起来却会很不舒服.因此写点自己实现这些数据结构的代码,大家可以借鉴一下,顺便自己总结一下热热手. 之前已经发了几篇博文,但是由于是第一次写博客,好几篇都是改了又改,恐怕很多同学没有注意到,这里声明一下,希望感兴趣的同学回去重新看一下修改过的代码,变得更好看和精巧了. 本系列文章,每篇首先简单介绍下,然后给出对应代码.暂时由于个人水平所限,代码经常…
C++基础代码--20余种数据结构和算法的实现 过年了,闲来无事,翻阅起以前写的代码,无意间找到了大学时写的一套C++工具集,主要是关于数据结构和算法.以及语言层面的工具类.过去好几年了,现在几乎已经回忆不起当年写代码时的情况,不过,通过文件头部注释里的日期,还是依稀想起了那些日子发生的一些事情,不禁感慨了一番.感概之余,随便翻阅了一下,发现当年的编程手法和现在相比,略显稚嫩,风格也相差的比较大了,明显受到当时读的一些经典C++书籍的影响.不过好在代码质量都算可以,都属于基础的语言层面以及数据结…
一.二叉树回忆 上一篇我们对数据结构中常用的树做了介绍,本篇博客主要以二叉树为例,讲解一下树的数据结构和代码实现.回顾二叉树:二叉树是每个节点最多有两个子树的树结构.通常子树被称作“左子树”(left subtree)和“右子树”(right subtree) 二.二叉树比链表好在哪里? 看看如下的数据:使用链表形式存放 我们要向查找数据6,需要从头开始查找,找到最后一个,查找比较麻烦.再来看看使用二叉树的形式存储 显然,我们很清楚自己要查找的目标大致会在那里出现: 例如查找的目标是6,那么我知…
最近各种瞎写数论题,感觉需要回顾一下数据结构 写一发splay冷静一下(手速过慢,以后要多练练) 用splay是最直接的方法,但我感觉离散一波应该可以做出来(没仔细想过) 现在没有很追求代码优美,感觉得先打的对打的快O(∩_∩)O #include <bits/stdc++.h> #define INF 1000000000 using namespace std; int root,N,n,x; ],c[][],a[]; void rot(int x) { ]==x; c[fat][k]=c…
(这里是Splay基础操作,reserve什么的会在下一篇里面讲) 好久之前就说要学Splay了,结果苟到现在才学习. 可能是最近良心发现自己实在太弱了,听数学又听不懂只好多学点不要脑子的数据结构. 感觉Splay比Treap良心多了——代码真的好写. 对于Splay显然可以维护Treap的所有操作,并且本质是BST. 先看看Splay是怎么维护普通平衡树操作的吧. 首先先定义一些基础的变量(若不作特殊说明这些变量的意义不变) int t[N][2] // t[x][0]表示节点x的左子树,t[…