二叉平衡树的算法复杂度笔记

AVL: http://www.oschina.net/code/snippet_176897_14149

二叉查找树http://www.oschina.net/code/snippet_176897_14148

红黑树:http://www.oschina.net/code/snippet_176897_14155

 

SBT:  http://www.nocow.cn/index.php/SBT

AVL:  http://www.nocow.cn/index.php/AVL%E6%A0%91

Treap: http://www.nocow.cn/index.php/Treap

 

https://github.com/PeterRK/DSGO/blob/master/book/index.md

 

 

插入,删除

n为树内节点个数,h为树的高度,

树的各种操作的复杂度都依赖于树的高度,所有操作的复杂度均为O(h), h可能log(n),也可能n

 

则普通的二叉查找树,操作复杂度均为log(n),最坏情况可能O(n),可以证明,随机构造的树的平均高度为log(n),所以平均复杂度为log(n)

 

AVL树保持每个结点的左子树与右子树的高度差至多为1,从而可以证明树的高度为O(log(n))

Insert操作与delete操作的复杂度均为log(n),旋转操作可能会达到log(n)

 

红黑树赋予了树一定的性质,从而在保持这些性质的同时,能保证树的高度为log(n)

性质中如:节点有红黑2色,其中路径中黑结点数目相同。红节点的2个子结点均为黑,根节点为黑,NIL节点为黑。

 

红黑树的insert操作,在最普通的insert()后,调用insert_fixup()来保持树的节点的性质。

Insert()的复杂度log(n),insert_fixup()复杂度也为log(n),另外insert_fixup()里可能有旋转操作,不过至多进行2次,每次复杂度均为O(1)

代码中一共3种情形,除了case1可能调用log(n)次,其它2种情况最多执行1次。

 

红黑树的delete操作,同样在正常的delete()操作后,调用delete_fixup()来保持节点的性质。

delete ()的复杂度log(n), delete_fixup()复杂度也为log(n),另外delete_fixup()里可能有旋转操作,不过至多进行3次,每次复杂度均为O(1)

代码一共4种情形,除了case2可能循环log(n)次,其它3种情况最多执行1次。

 

Treap树堆,保证是树的同时又是一个堆,可以证明树堆的期望复杂度为log(n), 因此所有操作的期望复杂度也为log(n)

你可能感兴趣的:(算法)