-
“今晚才发现,我读研方向是设计支持 ‘区间更新,单点查询’ 的数据结构和搜索算法,不经想到了人不为己天诛地灭。”
-
区间更新:
- 即订阅的谓词约束所定义的区间,插入一个谓词就相当于更新这个区间。
- 比如:插入6号订阅的第一个谓词 {1,[18,23]}, 表示在属性1上的区间[18,23]里插入订阅ID 6, 查询18、19、20、21、22或者23时就要返回 6。
-
单点查询:
- 事件的每个非空属性就相当于一个一维空间上的一个点,每个非空属性上的匹配任务就是找到这个属性上定义的所有包含这个点的区间所对应的订阅ID
- 比如事件有个pair<1, 20>,表示在属性1上取值为20,20被 [18,23]包含,所以要返回 6。
-
单点更新:
- 单点就是区间长度为1时的特例,所以支持区间更新就必然支持单点更新。
-
区间查询 [l,r]:
- 第一种:查询包含 [l,r] 的所有区间所对应的订阅ID 方法:先查询所有包含 l 的区间的匹配订阅ID,然后查询所有包含 r 的区间的匹配订阅ID, 二者的交集就是所有既包含 l 又包含 r 的闭区间所属的订阅ID,肯定是包含了区间 [l, r] 的
- 第二种:查询与 [l,r] 有交集的区间所属的订阅 方法:将 l、r 的查询结果取并集得到的匹配结果不能构成完整答案,漏掉了含于 [l, r] 的小区间对应的订阅 (不过这个问题有实际场景吗)
- 查漏补缺: 方法1:求 l到r 的中点 mid,查询 mid,进一步减少漏找出的订阅,含于 [l, mid] 或 [mid, r] 的区间仍然被漏,这是个取舍问题,是个模糊匹配。 方法2:根据宽度分层,比如某层宽度 w 大于等于 r-l,就不存在含于 [l, r] 的小区间这种漏掉的订阅,此时只需对 w<r-l 的层做进一步处理,和上一个方法可以结合起来。
- 结论:不理想。
-
题外话:线段树、树状数组都是解决的1个维度上的问题,需要在每一个维度上都建这么一个数据结构进行查询,而HEM还支持高维度,利用了多维过滤的思想,把多个维度上的反向查找任务压缩成了多个维度子集上的反向查找任务,此外HEM还有虚拟内存、负载均衡方面的优化思想,提高了空间(换时间)的利用率、稳定性(最差和最好情况接近,可以说数据集均匀分布下基本不受事件取值分布的影响)。
-
收牛:树状数组、线段树可以计算区间和、最大值这类的统计学特征,但应该不能用HEM计算这些问题,看来匹配问题和前缀和问题还是有本质区别的,转化不了。