码迷,mamicode.com
首页 > 编程语言 > 详细

[学习-思考-探究]莫队算法 曼哈顿最小生成树与分块区间询问算法

时间:2017-08-13 14:13:49      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:算法复杂度   端点   长度   步骤   记录   区间   最优   思想   本质   

前段时间刷了一些莫队算法的题目,这里记录了一些理解和思考。
莫队算法
算法
莫队算法用于解决一类可以由区间[l,r]的答案可以快速转移出区间[l-1,r],[l+1,r],[l,r+1],[l,r-1]的区间离线询问问题。
我们假设转移的复杂度是c
莫队算法的"本质"是把把每一个区间看成平面上的点,l是横坐标,r是纵坐标。
由点(l0, r0)转移到(l, r)的复杂度是(|l-l0|+|r-r0|)c。转移次数即是两点之间的曼哈顿距离。
所以对所有的询问作曼哈顿最小生成树可以避免不必要的计算。
莫队算法采用了分块思想,把整个区间分成$\sqrt{n}$个小区间,以询问左端点所在区间为第一关键字,右端点位置为第二关键字排序。
可以保证时间复杂度是$O(n*\sqrt{n})$
具体的步骤这里略过。
这样做一定是最优的吗?
实际上求曼哈顿最小生成树有$O(nlog{n})$的算法,莫队算法中求得的不是曼哈顿最小生成树。
考虑如果平面上有n/2个点,保证任意两点之间的曼哈顿距离大于等于$/sqrt{n}$(这里指的是近似值...不过显然是可以做到的),它们的曼哈顿最小生成树有n/2-1条边。
总长度自然也就大于等于$n*\sqrt{n}$(忽略系数..)因此,莫队算法这样的做法是较优的,如果求曼哈顿最小生成树,算法复杂度仍是$O(n*/sqrt{n})$。

[学习-思考-探究]莫队算法 曼哈顿最小生成树与分块区间询问算法

标签:算法复杂度   端点   长度   步骤   记录   区间   最优   思想   本质   

原文地址:http://www.cnblogs.com/inone/p/7353261.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!