假定(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
阅读(1714) | 评论(0) | 转发(0) |