`
febird
  • 浏览: 256448 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

count, sum, avg by range in log(n) time

 
阅读更多

考虑一下这样一个查询:

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;
}
 

 

分享到:
评论

相关推荐

    SUM_AVG.rar_SUM

    文件“SUM_AVG.txt”可能包含了关于如何使用SUM和AVERAGE函数的实际示例或者进一步的解释,包括可能的组合使用、嵌套函数的运用、以及在特定场景下的最佳实践。学习并熟练掌握这些基本函数,将极大地提高你在处理...

    Mysql中的count()与sum()区别详细介绍

    在MySQL数据库中,`COUNT()` 和 `SUM()` 都是聚合函数,用于处理一组数据并返回单个值。然而,它们的功能和应用场景有着明显的区别。 `COUNT()` 函数主要用于统计指定列中有值的行数。当`COUNT()`的参数是一个列名...

    sql中count或sum为条件的查询示例(sql查询count)

    在SQL查询中,`COUNT()` 和 `SUM()` 函数是非常重要的聚合函数,它们用于统计行数和计算特定列的总和。在处理大数据时,尤其是分析数据或进行报告时,这些函数经常作为查询条件来筛选满足特定条件的记录。本文将通过...

    air_data.csv

    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_...

    python 通过可变参数计算n个数的乘积方法

    for i in range(count): N=eval&#40;input("依次输入乘数:"&#41;) list.append(N) print("一共有",count,"个要相乘的数") print("把这些乘放在列表里面:",list) the_input() def get_mul(*num): sum =1 for n...

    吉他谱_Dear Maria, Count Me In - All Time Low.pdf

    初级入门吉他谱 guitar tab

    使用SQL语句统计数据时sum和count函数中使用if判断条件的讲解

    在SQL语句中,`SUM` 和 `COUNT` 函数是非常常见的聚合函数,它们用于对一组数据进行求和或计数。然而,在某些场景下,我们可能需要在这些函数中加入条件判断,以便更精确地统计特定条件下的数据。本文将深入讲解如何...

    LINQ_to_SQL.zip_SUM_linq

    本篇将深入探讨LINQ to SQL的使用,特别是涉及`Where`、`Select/Distinct`、`Count/Sum/Min/Max/Avg`、`OrderBy`、`GroupBy/Having`等核心概念。 ### 1. LINQ查询基础 LINQ查询由一系列查询表达式组成,这些表达式...

    Go-Count-Min-Log的一个Go实现

    今天我们将深入探讨一个在Go中实现的Count-Min-Log数据结构。 Count-Min-Log是一种用于近似计数稀疏事件的数据结构,它是在Count-Min Sketch的基础上进行优化,以降低内存需求。Count-Min Sketch最初由Cormode和...

    SQL复习之聚集函数

    WHERE AVG(sales_amount) = (SELECT MAX(avg_sales) FROM (SELECT AVG(sales_amount) AS avg_sales FROM sales GROUP BY category_id)); ``` 通过理解并熟练运用这些聚集函数,我们可以更好地分析数据库中的数据...

    mysql中count(), group by, order by使用详解

    在MySQL中,`COUNT()`, `GROUP BY`, 和 `ORDER BY` 是三个非常重要的SQL语句组成部分,它们各自承担着不同的职责,同时也常被结合在一起使用以满足复杂的数据查询需求。 `COUNT()` 是一个聚合函数,它用于计算指定...

    施耐德电气 Zelio Count计数器产品认证——Zelio time-counter-control UL certificate.pdf

    施耐德电气 Zelio Count计数器产品认证——Zelio time-counter-control UL certificatepdf,施耐德电气 Zelio Count计数器产品认证——Zelio time-counter-control UL certificate

    SQL语句中SUM与COUNT的区别深入分析

    在SQL语言中,SUM和COUNT是两种非常常用的聚合函数,它们在数据分析和报表生成中扮演着重要角色。本文将深入探讨这两个函数的区别及其在实际应用中的用法。 首先,我们来了解一下SUM函数。SUM函数的主要功能是对...

    处理group by 查询速度太慢的问题 数据量大.doc

    例如,在本实例中,需要将 device_id、product_id 和 log_time 三个字段设置为联合索引。 知识点2:索引字段的选择 在设置索引时,需要选择合适的字段。除了 Group By 字段外,还需要考虑聚合函数用到的字段。例如...

    Android代码-Count

    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 ...

    SQL中GROUP BY的用法

    select prd_no,avg(qty) from sales group by prd_no select count(prd_no) from sales select prd_no,max(qty) from sales group by prd_no select prd_no,min(qty) from sales group by prd_no select prd_no,sum...

    AVLTree:具有以下操作的通用AVL树实现:插入,删除,搜索,上下限,最近的元素,范围内的值等

    问题:AVL树目的:了解平衡二叉搜索树的端到端知识,以及如何将其有效地用于解决各种问题。 任务:通过以下操作实现AVL树。...9. Count the number of elements in the tree whose values fall into a given range.

Global site tag (gtag.js) - Google Analytics