划分树,线段树的一些文章

划分树(kth数)

http://www.cnblogs.com/AndreMouche/archive/2011/03/04/1971291.html

http://www.notonlysuccess.com/?p=142#more-142


划分树类似于经典的select算法。选择一个元素,如果小于该数的元素个数>=k,则在左边找,否则在右边找。

1. 对原数组排序

2. 建树。用排序好的中位数将原数组划分成两部分,左子树小于中位数,右子树大于中位数。至到区间只有一个元素为至。

3. 在每一层建立中需要保存每一个元素左边元素中位于下一层左子树的个数。这样给定一个区间就知道了该区间中有多少元素位于左子树中,即有多少元素是小于该层的中位数的。

4. 如果位于左子树元素个数>=k,则向左子树遍历,否则右子树。


线段树

http://w3.jouy.inra.fr/unites/miaj/public/vigneron/cs4235/l5cs4235.pdf

http://dongxicheng.org/structure/segment-tree/

http://hi.baidu.com/alpc62/blog/item/469edeca0043e382c8176875.html


线段树和区间树相仿,只是线段树的空间为O(nlogn),时间为O(logn),而区间树为空间O(n),时间为(KLogn)。

1. 线段树是先建立一个满二叉线段树,每一个节点保存一个线段区间[0-N],左子树为[0-n/2], [N/2+1,N],直到区间只有一个元素。

2. 在该基础上插入给定区间,如[1-3][2-4],[3-7]。插入区间即遍历1中建立的二叉树,如果某一个区间被插入区间包含而该区间次数+1(用于统计该区间被包含多少次,便于查询)

3. 建立完成。

相比区间树,线段树好处在于只要查询一次就可以知道与查询点相交的所有区间,而区间树则需要查询k次,而且需要其他操作辅助。


这里只是简单的介绍概念,知道而已,还需要很多学习



展开阅读全文

没有更多推荐了,返回首页