首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

线段树、优先队列、单一队列小结

2012-09-18 
线段树、优先队列、单调队列小结主要处理问题:线段树:区间处理,一般需要对整个区间执行相同的操作,时间复杂

线段树、优先队列、单调队列小结
主要处理问题:线段树:区间处理,一般需要对整个区间执行相同的操作,时间复杂度O(log(n))
优先队列:堆实现,找出最小或最大元素,或者第k小或第k大元素,一般区间内元素个数不变,只有个别元素会发生变化。时间复杂度O(log(n))
单调队列:设队列中元素从小到大,则如果要插入元素比队尾大,则直接入队。如果比队尾小,则队尾元素出队,直到发现队尾不比插入元素小或者队为空,再入队。
有规律的更新区间内元素,需要判定队头元素是否符合条件。可以处理最小或最大问题,或者第k小或第k大问题。时间复杂度O(n)
线段树推荐博客:http://www.notonlysuccess.com/index.php/segment-tree-complete/线段树模板:

//每次取出k个连续元素中最小值struct Queue{int pos;int w;Queue(){}Queue(int pos, int w): pos(pos), w(w){}}queue[nMax];int N, K;void update(){int front, rear;front = rear = 0;int i;for(i = 1; i <= N; ++ i){while(front != rear && queue[front - 1].w > A[i]) front --;//入队queue[front ++] = Queue(i, A[i]);if(i >= K){while(queue[rear].pos <= i - K)//排除rear ++;printf("%d ", queue[rear]);//取出数据}}}



热点排行