Chinaunix首页 | 论坛 | 博客
  • 博客访问: 923769
  • 博文数量: 201
  • 博客积分: 8078
  • 博客等级: 中将
  • 技术积分: 2162
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-20 17:22
文章分类

全部博文(201)

文章存档

2013年(3)

2012年(11)

2011年(34)

2010年(25)

2009年(51)

2008年(77)

分类: 数据库开发技术

2009-12-25 18:26:52

假定(N < M), 从K个数据库中选出第N-M条记录。排序字段为 F (F 假设为整数值)。
为了解析方便,作如下假设:
1、在整个处理中,所有的数据库没有发生变化。
2、这里假设每条记录都排序位置确定, 就是不存在F完全相等的记录。
3、如果存在F相等的情况,需要换成排序确定的。
4、如果多个排序字段, 也可以转换成一个排序字段。

1) 给定F的数值,计算 F < Fd的记录数量,(也就是F如果是数据库中存在的记录,则为该记录拍第几)。
算法步骤(很简单):
在原来的查询条件下增加, F < Fd, 统计所有的数量,那么就知道Fd 在所有的记录中排位了。

2)如果给定Fd, 得到Pd (排位), 并且 N <= Pd <= M 那么最终的查询结果可以这么处理。
1、K个数据库返回 F < Fd 的最后 (Pd - N) 条记录。
2、K个数据库返回 F > Fd 的前面 (M - Pd) 条记录。
3、对1, 2的记录排序。在排序结果中,假设Fd 排名为 Pd' 那么排在Pd' 的前面 (Pd - N)条记录,
和排在Pd' 的后面的 (M - Pd) 条记录就是所需要的查询结果。

3) 剩下的问题是, 如何快速选出一个Fd, 使得处于符合的约束 N <= Pd <= M。
我们知道二分查找的时间复杂度为log(N), 于是我们参照二分查找就可以比较快速的选出一个Fd。
算法步骤:

Step.1 从K个数据库中选出记录中,F字段排中间的F值,以及中间值前面的数量T-low, T-high。
将结果记录为:
Mid-1, Mid-2, Mid-3, ..., Mid-k, 排序中间值
T-low-1, T-low-2, T-low-3, ..., T-low-k 前面的数量
T-high-1, T-high-2, T-high-3, ..., T-high-k 后面的数量

假设 Ts = 所有T-low-? 和 T-high-?的数量。  
如果 Ts < N, 那么查询结果为空值, 查询结束.
如果 N < Ts < M, 转 Step.final
如果 Ts > M 转 Step.2

Step.2 从Mid-1, Mid-2, Mid-3, ..., Mid-K 中选择一个参考值, 记录为Mid-r
对于 Mid-1, Mid-2, Mid-3, ...., Mid-K, 如果 Mid-? < Mid-r, 那么T-l-r += T-low-? 否则 T-h-r += T-high-?; (注意,各个Mid-? 不会存在相等的情况)
分别取r = 1, 2, 3, ...., k
那么可以得到
 T-l-1, T-l-2, T-l-3, ..., T-l-k
 T-h-1, T-h-2, T-h-3, ..., T-h-k

将所有的 T-l-?, 与N 排序。取最靠近N的的Mid-? 增加条件 F > Mid-?, 优先取 > N的。
将所有的 (Ts - T-h-?) 与M 排序。取最靠近M的Mid-?, 增加条件 F < Mid-?,优先取 < M的。
如果存在T-l-a > N, T-l-b < M 并且 a = b,那么查找结束,最终 Fd = F-a = F-b
转Step.1

阅读(1689) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~