考虑一下这样一个查询:
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:
DB_ENV** dbenv;
DB* db;
/*.....*/
db_create(&db, dbenv, 0);
db->open(db, NULL, "tablename", "filename", DB_BTREE, DB_CREATE, 0);
db->set_flags(db, DB_RECNUM);
/*.....*/
int get_rank(DB* db, const void* key, size_t klen, db_recno_t* rank)
{
int ret;
DBC* curp;
DBT key = {0}, data = {0}, ignore = {0}, recno = {0};
key.data = key;
key.size = klen;
recno.data = rank;
recno.size = sizeof(*rank);
ret = curp->get(curp, &key, &data, DB_SET);
if (0 == ret) {
ret = curp->get(curp, &ignore, &recno, DB_GET_RECNO);
}
return ret;
}
分享到:
相关推荐
Count Time in Milliseconds
FLIGHT_DATE AVG_FLIGHT_COUNT AVG_BP_SUM BEGIN_TO_FIRST LAST_TO_END AVG_INTERVAL MAX_INTERVAL ADD_POINTS_SUM_YR_1 ADD_POINTS_SUM_YR_2 EXCHANGE_COUNT avg_discount P1Y_Flight_Count L1Y_Flight_Count P1Y_...
for i in range(count): N=eval(input("依次输入乘数:")) list.append(N) print("一共有",count,"个要相乘的数") print("把这些乘放在列表里面:",list) the_input() def get_mul(*num): sum =1 for n...
适合学生练习使用的简单事件记录小应用 可以记录事件标题 内容 时间 使用了控件的多种属性 也使用安卓的初学者学习安卓是的小练习
How to count the number of lines in a text file
聚合函数可以是:sum,count,avg,max,min,first_value,last_value,rank,dense_rank ,row_number, ratio_to_report Over不能单独使用,用来制定数据窗口大小 Partition by表示分类数据集合,在此集合上的运算 Order by...
This shows how to count off time in a Stop Watch format.
本文将介绍Mysql中的count()与sum()区别,需要的朋友可以参考下
android 根据倒计时刷新UI,可以看看!
在开发时,我们经常会遇到以“累计(count)”或是“累加(sum)”为条件的查询,下面使用一个示例说明使用方法
order by 、group by 、having的用法区别 order by 从英文里理解就是行的排序方式,默认的为升序。 order by 后面必须列出...像sum()、count()、avg()等都是“聚合函数” 使用group by 的目的就是要将数据分类汇总。
施耐德电气 Zelio Count计数器产品认证——Zelio time-counter-control UL certificatepdf,施耐德电气 Zelio Count计数器产品认证——Zelio time-counter-control UL certificate
AndroidStudio项目制作倒计时模块AndroidStudio项目制作倒计时模块AndroidStudio项目制作倒计时模块
android project in kotlin to count the days from a time point. MIT licensed. I needed an app that would count days since a date and days until. The current apps on the market, even paid ones don't ...
问题:AVL树目的:了解平衡二叉搜索树的端到端知识,以及如何将其有效地用于解决各种问题。 任务:通过以下操作实现AVL树。...9. Count the number of elements in the tree whose values fall into a given range.
SUM是对符合条件的记录的数值列求和 COUNT 是对查询中符合条件的结果(或记录)的个数 例如: 表fruit id name price 1 apple 3.00 2 pear 4.00 select count(price) from fruit; —-执行之后结果为:2 (表示有...
SQL SUM() 函数 SUM() 函数 SUM() 函数返回数值列的总数。 SQL SUM() 语法 SELECT SUM(column_name) FROM table_name; 演示数据库 在本教程中,我们将使用 RUNOOB 样本数据库。 下面是选自 “access_log” 表的...
Count-Min-Log的一个Go实现
设X[ 0 : n - 1]和Y[ 0 : n – 1 ]为两个数组,每个数组中含有n个已排好序的数利用分治策略试设计一个O (log n)时间的算法求出这2n个数的中位数。 由文件input.txt提供输入数据。文件的第1行中有1个正整数n(n),...