摘要:
假设一个二叉查找树中的数据都是链式的(即都集中在左子树或者右子树),那么这时候对该二叉查找树进行查找的时间复杂度就是$O(n)$,背离了二叉查找树用来优化数据查询的目的。而平衡二叉树可以使树的高度在每次插入元素后,查询操作仍然能保持$O(logn)$的时间复杂度。 对平衡二叉树的任意结点来说,要保证 阅读全文
摘要:
二叉查找树的特点: 在二叉查找树中左子树上所有结点的数据都小于等于根结点的数据,而右子树上所有结点的数据都大于根结点的数据 //存储结构: struct node { Int data; node *lchild; node *rchild; }; //在建树前根节点不存在: Node *root 阅读全文
摘要:
//树的静态存储结构 struct node { int data; vector child; }Node[Max]; //新建一个结点 int index = 0; // index是结点坐标 int newNode(int v) { Node[index].data = v; Node[ind 阅读全文
摘要:
//二叉树存储结构: struct node { Int data; node *lchild; node *rchild; }; //二叉树在建树前根节点不存在: Node *root = NULL; //新建结点: node *newNode(int v) { node *Node = new 阅读全文
摘要:
汉诺塔问题:有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,求至少需要多少次移动。 我们首先假设n=1,那么move(n)=1,因为这时候只需要从A->C便可以。接下来假 阅读全文
摘要:
手写数组实现队列 int queue[20]; int front,rear; void clear() { front = rear = -1; } int size() { return (rear-front); } bool empty() { if(front==rear) return 阅读全文
摘要:
中缀表达式指的是"1+2-3*4/5"这种其实就是我们通常见到的书写算式顺序,要计算中缀表达式则首先要将字符串转换成后缀表达式并存储在一个队列当中,即1 2 3 4 5 / * - +(空格只是为了隔开方便理解),可以看到数字都集中在了前面,算术符号则集中在后面。然后计算后缀表达式的方式便是从开头遍 阅读全文
摘要:
首先当然要包含algorithm头文件 :#include <algorithm> max(x,y) min(x,y) 参数可以是浮点数 abs(x) x必须是整数 如果x是浮点数则要用math头文件下的fabs(x) swap(x,y) 交换x和y reverse(it,it2) it和it2可以 阅读全文
摘要:
vector vector可以理解成变长数组,即长度根据需要而自动改变的数组 头文件:#include <vector> 定义:vector<typename>name; vector内可以通过下标或者迭代器(iterator)访问(只有vector和string才允许使用v.begin()+3这种 阅读全文
摘要:
这个题目可以作为练习写大/小根堆的实现,不过貌似时间复杂度还是蛮高的。在洛谷上面一道模板题上面好像就超时了几个点,不知道是不是我实现的问题。那么除此之外,最容易想到的方法是先对该数组进行排序,然后取出第K或MAX-K数来。当选择使用快排的时候,时间复杂度是$O(nlogn)$。但还有一种更优的方法是 阅读全文
摘要:
求解最大公约数常用欧几里得算法(即辗转相除法) 设a、b均为正整数,则$gcd(a,b)=gcd(b,a\%b)$ 证明:设$a=kb+r$,其中k和r分别为a除以b得到的商和余数。则有$r=a-kb$成立。 设d为a和b的一个公约数,那么由$r=a-kb$,得d也是r的一个约数。因此d是b和r的一 阅读全文
摘要:
如果要求一个正整数N的因子个数,只需要对其质因子分解,得到各质因子$P_i$的个数分别为$e_1$、$e_2、...、e_k$,于是N的因子个数就是$(e_1+1)*(e_2+1)*...*(e_k+1)$。原因是对每个质因子$P_i$都可以选择其出现$0$次、$1$次、...、$e_i$,共$e_ 阅读全文
摘要:
二分查找的高效在于,每一步都可以去除当前区间中的一半元素,因此这种算法的时间复杂度是$O(logn)$ 二分的前提是该序列是有次序的,例如递增或递减 //序列中是否存在满足某条件的元素 int binarySearch(int A[],int left,int right,int x) { int 阅读全文
摘要:
万能头文件:#include<bits/stdc++.h> 优点:几乎包含了所有c++标准库头文件 缺点:这不是标准的头文件,所以有的OJ不支持。而且编译的时间相对长 关闭stream同步,加快cin读入的速度:ios::sync_with_stdio(false) 但仍然不要将cin和scanf或 阅读全文
摘要:
当需要开数组存储状态的时候,要根据提供的内存限制选择适合的数据类型和数组大小。 1TB=1024GB 1GB=1024MB 1MB=1024KB 1KB=1024Byte 1Byte=8bit 例如当题目中的内存限制为128MB,即(128*1024*1024)Bytes>10^10Bytes,代表 阅读全文
摘要:
当我们要在一组数据中找到最小/大值或者前K大/小值的时候,我们可以使用传统的遍历方法。那么这个时候时间复杂度就是$O(N^2)$,但我们可以使用"堆"来进行优化,我们可以把找到最小/大值的复杂度降低到$O(logN)$。插入一个新值的复杂度也是$O(logN)$。 维护一个堆关键的就是向下维护和向上 阅读全文
摘要:
关于素数的定义:在大于1的自然数中,除了1和它本身以外不再有其他因数。 判断一个数是否是素数: int x; // 要求的数 for(int i=2;i<=sqrt(x);++i) { if(x%i==0) { cout << "这不是素数" << endl; break; } } 埃氏筛法(时间复 阅读全文
摘要:
并查集通常用来判断一组数据里面的包含关系,因此核心就是find()以及merge()两个功能 int box[10005]; void initial(int limit) { for(int i=0;i<=limit;++i) { box[i]=i; //初始化 } } int find(int 阅读全文
摘要:
算法复杂度:$O(nlogn)$ (递归为$O(logn)$) 快速排序算法当序列中元素的排列比较随机时效率最高,但是当序列中元素接近有序时,会达到最坏时间复杂度$O(n^2)$,产生这种情况的主要原因在于主元没有把当前区间划分为两个长度接近的子区间。因此我们应该随机选择主元或者取中间的数据作为主元 阅读全文
摘要:
指针实现: 操作运行时间均为[latex]O(1)[/latex] 缺点是对malloc和free的调用昂贵 #include <cstdio> #include <malloc.h> #include <cstdlib> struct Node; typedef struct Node *PtrT 阅读全文