一日一技:快速判断一个数属于等间隔范围中的位置

简介: 一日一技:快速判断一个数属于等间隔范围中的位置

有一组等间隔的范围:

range_group = [
(0,10), (10, 20), (20, 30), (30, 40), (40, 50),
(50, 60), (60, 70), (70, 80), (80, 90), (90, 100)]

这些范围都是左闭右开区间,例如 (7,8)表示 7<=x<8

现在有一个实数n,如何快速判断它在哪个范围内?

显然,可能有同学会这样写:

range_group = [
(0,10), (10, 20), (20, 30), (30, 40), (40, 50),
(50, 60), (60, 70), (70, 80), (80, 90), (90, 100)]
for pair in range_group:
    if pair[0] <= n < pair[1]:
        print(f'{n}在范围:{pair}中。')

这种方式只需要遍历range_group一遍就可以了,看起来速度还可以,时间复杂度为 O(n)

那么如果我有m个实数需要判断怎么办呢?此时时间复杂度将会变成 O(m*n)

那我们有没有更优化的办法呢?

假设 n=73,如何让程序知道它在 [7,8)这个范围中?

考虑到 73// 10 = 7,而 70// 10 = 7。其中 //在Python 3中表示相除对结果向下取整。

于是我们可以首先构造一个字典:

range_group = [
(0,10), (10, 20), (20, 30), (30, 40), (40, 50),
(50, 60), (60, 70), (70, 80), (80, 90), (90, 100)]
range_dict = {x[0] // 10: x for x in range_group}

生成的 range_dict如下图所示:

接下来,只需要从字典中找 n// 10即可。如果找不到,那么n就是小于0或者大于等于100。

于是完整代码可以写为:

range_group = [
(0,10), (10, 20), (20, 30), (30, 40), (40, 50),
(50, 60), (60, 70), (70, 80), (80, 90), (90, 100)]
range_dict = {x[0] // 10: x for x in range_group}
target_list = [-3, 86, 92, 104]
for target in target_list:
    if target < 0:
        print('数字小于0')
        continue
    position = range_dict.get(target // 10, '大于100)')
    print(f'被查询的数字: {target},所在的范围为:{position}')

运行效果如下图所示:

使用这种方式,时间复杂度为 O(m),比直接遍历快了不少。

请大家思考,如果数字范围的间隔不是整10,应该怎么办。

目录
相关文章
|
Java 开发者
使用HashMap的values()方法返回的值转换为List时遇到错误
使用HashMap的values()方法返回的值转换为List时遇到错误
|
11月前
|
NoSQL 安全 Java
Java后端基础自测
Java后端基础自测
105 12
|
机器学习/深度学习 存储 边缘计算
边缘计算
【7月更文挑战第13天】边缘计算
236 7
|
Web App开发 自然语言处理 iOS开发
GitHub 中文化插件
这款插件专为GitHub设计,实现菜单栏、标题及按钮等元素的汉化,并提供项目描述的人机翻译,助力新手快速上手。相较于浏览器自带翻译,准确性更高。安装需先配备Tampermonkey或Violentmonkey,随后从GreasyFork安装插件,重启GitHub即现中文界面。
592 0
|
存储 安全 测试技术
Postman工具介绍
【6月更文挑战第1天】Postman是一款由Postman公司开发的API开发协作软件,广泛应用于API设计、构建、测试和安全管理。
|
开发工具 git
git revert 多条已提交的记录
我需要撤销最后的四个提交 如果用git revert 一个一个revert 挺费劲,可以用git revert OLDER_COMMIT^..NEWER_COMMIT 这种格式,对应我的工程就是 $ git revert 54b23c2251acde.
5859 0
|
安全 NoSQL 程序员
我就算跳出去死外边也不会学【实用调试技巧/程序员内功修炼】
我就算跳出去死外边也不会学【实用调试技巧/程序员内功修炼】
88 1
|
Android开发 Java
[架构设计] 组件和模块的区别
组件(Component)和模块(Module)又是一对容易混淆的名词,也常常被用来相互替换。两者是否有差异往往取决专业背景、所在领域、以及视角。个人总结,从设计上来看,组件强调复用,模块强调职责(内聚、分离),或者说组件是达到可复用要求的模块。
3320 0
人事管理项目-员工资料导出
人事管理项目-员工资料导出
|
Java API C++
IOC理解
成功就是简单道理的深刻理解与灵活运用 前不久,阿里大牛虾总在群里抛出一个问题:“从深层次讲解一下如何理解IOC,IOC和DI是一回事吗?” 这个问题真是让人平静而又不平静 平静源于此问题就像问中国人怎么使用筷子,天天使用筷子,难道还不会使用筷子? 但又不平静,你能写出一份详细的说明书,让一个不会使用筷子的人按此说明成功地使用上筷子吗?
425 0
IOC理解