1.avl tree:
插入看从trouble maker开始往不满足的点的路径中,靠近不满足的点的三代,是RR还是LL还是RL还是LR,如果是LR的,则最下面的节点作为中间节点,如果是RR,则左右互换。
要求通过左右子树到叶子的路径长度相差不超过1
2.splay tree:
要求访问一次就换到根上
插入或者访问如何换到根上:该节点往上看三代,如果是RL或者LR,则换到中间,这个叫做zig-zag
如果是LL或者RR,则倒过来连。这个叫做zig-zig
子树的连接,全部看如何满足二叉树。
3.红黑树
插入:如果叔叔是红色,直接叔叔和父亲变为黑色,爷爷变为红色,传递上去
如果叔叔是黑色,必须把父亲和自己转为RR或者LL,然后绕着爷爷转,转完以后,叔叔父亲变为红色(和上一个想反)爷爷和另一个变为黑色
删除:删除红色叶子:直接删
删除度数为1的点(只能是黑色):把其孩子涂成黑色替换他
删除度数为2的节点:用左边最大或者右边最小替换它,然后删除那个节点
删除黑色叶子:可能需要递归解决
4.Bin树
插入:总是和自己节点相同的树合并,然后进位,只要常数时间
复杂度总结:
树 | 复杂度 |
---|---|
avl | O(logN) |
splay | 摊销均为O(logN),最坏情况是O(N^2) |
binominal queue | 除了插入N个最坏是O(N),插入一个最坏是O(1),其他是O(logN) |
红黑树 | 插入O(logN),删除最坏为O(logN) |
master的三种方法:
判断分别为:N^logab和f(N),af(N/b)和f(N),a^k和b
比较的是叶子问题求和与合并时候的复杂度,如果叶子复杂度高,则为N^logba,如果是合并复杂度高,就是f(N)
注意,第二种只能差常数倍才行
注意相等的时候,分别为:N^logbaf(N), f(N)logbN,f(N)logN
5.搜索
注意:relevant是取回的中,相关度
recall是相关的中,取回的比例