IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 多区间查找问题(二分/map/设计) -> 正文阅读

[数据结构与算法]多区间查找问题(二分/map/设计)

问题背景

最近遇到一个需求,场景大概如下。
给定若干个id,每个id有一个若干个覆盖区间(这些区间可能相互重复)。
每次查询过来,给定一个key,问该key是否命中这若干id中的至少一个,并求命中的所有id。key命中id,当且仅当这个key落在了这个id里边的其中一个区间内。

这个问题中,读取配置,重新加载的频率较低,查询的频率较高。关注的是查询速度。

举个例子。有如下几个id。

{
	"0" : [[1, 10], [9, 13]],
	"1" : [[4, 12]],
	"2" : [[3, 4], [6, 8]],
	"3" : [[6,8]]
}
  • 如果key取5,那么它命中了id 0,1;
  • 如果key取8,那么它命中了id 0,1,2,3;
  • 如果key取13,那么它命中id 0。
  • 如果key取14,则它没有命中id。

声明

n n n=id个数, m m m=每个id的平均区间个数。
以下的例子讲解均基于以下配置

{
	"0" : [[1, 10], [9, 13]],
	"1" : [[4, 12]],
	"2" : [[3, 4], [6, 8]],
	"3" : [[6,8]]
}

暴力解法

存储

  • 存储每个id对应的区间列表。

查询

遍历每个id,对于当前id,看它是否存在区间,包含 Key,从而判断 Key是否命中当前id。
在这里插入图片描述

查询时间复杂度

O ( n ? m ) O(n*m) O(n?m)

二分优化

存储

  • 整合所有id的区间,将区间的左下标、右下标分别存储在有序下标列表中。
  • 对左下标列表和右下标列表,分别维护包含key的id列表。
  • 对于左边界下标列表,维护包含key,且区间右边界大于key的id列表。
  • 对于右边界下标列表,维护包含key,且区间左边界小于key的id列表。

在这里插入图片描述

查询

对于 Key,二分查找左区间列表中<= Key最近的lKey,以及右区间列表中>= Key最近的rKey。

1、如果左区间或右区间列表刚好存在 Key,则直接返回包含 Key的id列表。
在这里插入图片描述
2、如果lKey不存在或rKey不存在,则无解
在这里插入图片描述
3、如果lKey和rKey同时存在,且 Key不在区间里边中,则取同时包含lKey, rKkey的id列表
在这里插入图片描述
证明:如果 Key取5,那么此时lKey为4,rKey为8。我们取lKey的绿色区间和rKey的紫色区间的交集,{[1,10],[4,12]},对应的id为id0,id1
在这里插入图片描述
可以发现,同时包含lKey 4, rKey 8的区间,也一定包含 Key 5。

查询时间复杂度

O ( l o g ( n + m ) + n + m ) O(log(n+m)+n+m) O(log(n+m)+n+m)

二分再优化

存储

  • 整合所有id的区间,将区间的下标存储在有序下标列表中。
  • 对每个下标,维护包含key的id列表。
  • 对于下标,维护包含key、及其相邻key的id列表。
    在这里插入图片描述

查询

对于 Key,二分查找区间列表中<= Key最近的lKey。
1、如果区间列表刚好存在 Key ,则直接返回包含 Key的id列表。
在这里插入图片描述
2、如果lKey不存在,则无解。
在这里插入图片描述
3、如果lKey存在且lKey不等于 Key ,则返回包含lKey及其相邻key的区间,所对应的id列表(黄色部分)。
在这里插入图片描述
证明:如果 Key取5,那么此时lKey为4。我们取lKey的黄色区间{[1,10],[4,12]},对应的id为id0,id1
在这里插入图片描述
可以发现,同时包含lKey 4, 及其相邻key 6的区间,也一定包含 Key 5。

查询时间复杂度

时间复杂度 O ( l o g n + m ) O(log_{n+m}) O(logn+m?)

自己做了简单的demo代码,有兴趣的读者可以看看。
仓库地址

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-18 18:07:50  更:2022-04-18 18:10:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 7:46:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码