count, sum, avg by range in log(n) time
来源:互联网 发布:matlab凸包算法代码 编辑:程序博客网 时间:2024/06/05 18:29
考虑一下这样一个查询:
select count(*), sum(tax), avg(weight)
from pepole
where id >= ${minid} && id < ${maxid};
怎样才能实现更小的时间复杂度?
一般情况下,最简单的方法就是遍历这个区间。但是这需要O(logn +m)的时间复杂度,其中m是区间长度,n是总记录数。
实际上,可以略增一点存储代价,对该查询实现O(logn)的时间复杂度。我以前写过一篇文章,可以对count(*)实现logn复杂度:
count(*, minid, maxid) = rank(maxid) - rank(minid)
其中,rank(id) 表示该记录在整个表中的序号(排序名词)。这很容易理解。
如果要计算sum(x)或avg(x),需要扩张一下,在每个结点中存储一个隐藏值,用来表示该以结点为根的子树的sum(x)值,那么,插入/删除/修改的代价也是O(logn),计算sum(x),avg(x)的代价也是O(logn)。
sum(x, minid, maxid) = node(maxid).hidesumx - node(minid).hidesumx
avg(x, minid, maxid) = sum(x)/count(*, minid, maxid)
BekeleyDB中,可以实现 count(*) 的log(n)时间复杂度,因为它提供了类似rank()函数的功能,使用btree表,建表时提供DB_RECNUM标志。查询时,使用DBC::get,用DB_GET_RECNO flag:
- count, sum, avg by range in log(n) time
- mysql sum Count AVG
- Hibernate 使用 count(*)、avg、sum
- linq to sql (Group By/Having/Count/Sum/Min/Max/Avg操作符)
- 聚合函数(sum、count、max、min、avg)、where、group by、having的组合用法实例
- Count of Range Sum
- count,sum,avg,max,min__mysql学习笔记
- Oracle中有关Group by 中avg();sum();min();max();count();的运用整理(Oracle的执行顺序)
- SQL 查尋(分组/group by/count/sum/avg/max/min/null/having/top/over) 排序(rwo_number/rank/dense_raenk/ntile)
- Oracle中有关Group by 中avg();sum();min();max();count();的运用整理(Oracle的执行顺序)
- leetcode Count of Range Sum
- 327Count of Range Sum
- LeetCode Count of Range Sum
- [LeetCode]Count of Range Sum
- 327. Count of Range Sum
- Leetcode Count of Range Sum
- 327. Count of Range Sum
- leetcode Count of Range Sum
- 简述国内网络硬盘发展
- 字符串基数排序
- MapReduce应该做更少的事情
- .net 中的委托机制
- LoadRunner测试Google Suggest
- count, sum, avg by range in log(n) time
- Java之Servlet开发
- 使用 VMware Server 在 Oracle Enterprise Linux 上安装 Oracle RAC 10g(一)
- 谈一下怎样判断网页是静态的还是伪静态的?
- mysql 5.0存储过程学习总结
- 美国一个计算计程序员可以挣多少钱?
- 全局变量/全局静态变量/静态变量/静态局部变量/局部变量
- CSS和JS标签style属性对照表
- LC_ALL=en_US.UTF-8 让 awk 慢了 40 倍!