ACM
ShilongLi01
这个作者很懒,什么都没留下…
展开
-
平衡二叉树和红黑树的插入操作
平衡二叉树 1、插入操作 struct AVLtreenode { int data; //可以换成键值对类型,比较键值 int bf; //平衡因子的值是左子树高度减去右子树的高度,因此+1代表左子树高1,0代表左右一样高,-1代表右子树高1. AVLtreenode *lchild, *rchild; AVLtreenode() : data(0), bf(0), lchild(NULL), rchild(NULL) {} AVLtreenode(int va原创 2021-08-04 11:48:44 · 192 阅读 · 0 评论 -
二叉平衡树实现
二叉平衡树实现 讲解原理的博客较多,这里只进行实现。 由于serch比较简单,我们着重实现insert操作。 代码: struct AVLtreenode { int data; //可以换成键值对类型,比较键值 int bf; //平衡因子的值是左子树高度减去右子树的高度,因此+1代表左子树高1,0代表左右一样高,-1代表右子树高1. AVLtreenode *lchild, *rchild; AVLtreenode() : data(0), bf(0), lchild原创 2021-07-22 19:33:48 · 99 阅读 · 0 评论 -
双向bfs
双向bfs 解空间 例如,一个bfs的解空间为 st 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 ans 22 23 24 25 26 当用正常bfs从st起点向下搜索时,会发现,搜索空间不断变大,很可能会导致超时,那么我们就可以同时从ans和st进行搜索,可以减少解空间,降低时间复杂度。原创 2021-07-17 09:45:41 · 86 阅读 · 0 评论 -
排序之合并排序
排序之合并排序 题目: 给一个数组进行从小到大进行排序。 思路: 归并排序: 1、两个有序数组进行归并,复杂度为O(n)。那么就可采用分治,用logn次O(n)进行排序。 2、设置排序区间大小s,s从1开始直到len/2。 3、开一个和原数组一样大的数组作为辅助数组b,每次从a归并到b再从b归并到a。 void Mergesort(int a[],int r) { int s=1; while(s<r) { Mergepass(a,b,s,r);原创 2021-06-24 15:31:34 · 209 阅读 · 0 评论 -
凸包模板讲解
凸包模板Andrew算法处理方向顺序步骤代码(模板) Andrew算法 Andrew算法是Graham算法的变种。 其主要思想为把凸包上的点依次放入栈中, 如果发现形成了凹多边形(叉积为负值) 就删除一些点,使得又能够维持凸的形态。 这时就会发现,处理各个点需要按照x从左往右的顺序,排序即可 当然,这只是处理了下凸的一个凸壳,倒过来再刷一次,就得到了整个凸包 处理方向顺序 处理壳的方向为下半壳从左到右,上半壳从右到左。 步骤 1、先把点排序 x从小到大,x相等y从小到大 2、先把第一个点和第二个点加入栈中,原创 2021-05-30 16:05:10 · 343 阅读 · 0 评论 -
ACM个人算法集
个人ACM项目 我把做过的好题以及典型的算法及思路都保存到本地了,但是有时候上课想看代码却看不了,一个个写博客又很麻烦,因此我直接上传到了github上,这样即方便,又可以随时修改,希望里面的内容会对大家有帮助。 链接 https://github.com/1261586682/ACM ...原创 2021-06-08 09:58:24 · 135 阅读 · 0 评论 -
排序之快速排序
快速排序 题意: 给一个数组,从小到大进行快速排序。 思路: 每次选一个目标值target,把所有比target小的数放在target左边,大于target的数放在target右边。因此,target的位置就固定下来了,然后再分治target左半边和右半边。 1、因为进行了分治,最小单位至少为一个元素,当l>=r时返回,[l,r); 2、为了方便就去数组的第一个元素a[l]作为目标值,然后用双指针法把后面的元素进行操作。 3、设指针i,j,i指针从l+1向右直至第一个比l大的元素,j从r向左直至第一个原创 2021-06-24 14:15:24 · 117 阅读 · 0 评论