hutool的定时任务不支持依赖注入怎么办_设计一个任务调度算法,时间轮算法,比优先队列更高效...

当年我还是个学生的时候,有一次去参加欢聚时代的一个面试,有一道面试题记忆尤新,让你来实现一个定时任务,你会怎么做?为了简化问题,我们只用考虑内存方案,不用考虑数据持久化。

数组法

最简单的,我们可以把所有的任务存放在一个数组里面,然后,每隔单位时间遍历整个数组,找到是否有任务满足当前时间,如果有,那么从数组中取出,然后执行。每隔单位时间查询算法复杂度为O(N)。

那么,新增一个任务怎么操作呢?我们只要简单地往数组中追加一个元素即可,算法时间复杂度为O(1)

95183051f2d761499a584c3d582e8b91.png

优先队列法

评估一个算法,我们既要考虑它的查询算法复杂度,也要考虑他的插入算法复杂度。在定时任务场景中,很显然,查询场景是非常多的。几乎我们每个单位时间都要轮询一遍,那么我们有没有优化算法的可能呢?

我们每次查询,都只要查询时间最接近当前时间的,时间比当前时间更早的,肯定被我们丢弃了。所以这个题目,等价于我们查询队列里面时间最小的。我们不禁想到一个熟悉的数据结构,优先队列!活着我们可以使用一个小根堆进行实现。

每次我们插入一个新的定时任务,我们将一个任务插入优先队列,每次插入的时候,队列内部需要进行调整,算法时间复杂度为O(logN)。值得注意的是,在讨论算法时间复杂度的时候,logN是Base2的,也就是说,如果N等于8的时候,logN就是3。

同理,虽然我们可以在O(1)的时间里面找到时间最小的任务,但是如果我们取出这个元素,优先队列需要做内部的调整,这个算法时间复杂度也是O(logN)的。

时间轮法

上述优先队列的算法,综合算法时间复杂度是O(logN)的,已经很高效了,但是在我们大并发的分布式系统下,这个速度,还是太慢了。我们有没有更高效的算法呢?

那便是时间轮算法,时间轮是一个环形队列,按照时间的单位区分,我们假设1秒,每个单位里面,是一个链表,用来存储定时任务。

d6fe724a1715d6ab6f33bb1fe2439ce1.png

可能你会问,一个环形队列里面的元素,毕竟是优先的,如果超过了长度,我们该怎么办呢?我们可以联想到我们家里的水表,是不是也有很多个轮子,每一个轮子的单位不一样!

同样,时间轮也是如此,我们可以用多级时间轮进行优化,就跟我们的时钟或者水表一样,这一层的走了一圈,下一层的才走了一格。

8bc46e90907ca31c0b3f2b36c39bc07b.png

那么,这个算法的 时间复杂度怎么计算呢?插入的时候,我们从最低层开始查找,找到在哪一层,然后直接插入对应的刻度。假如我们的时间轮有5层,那么我们最多查找5次。

查询的时候,我们每一秒都是推动时间轮的滚动,每次都是直接取队首的元素,相当于算法时间复杂度为O(1)。当转了一圈的时候,把下一层的下一格再推下来。这样子,我们一个元素,最多会从第5层,逐渐插到第1层,综合下来一个元素最多会被插入5次,在算法时间复杂度评估的时候,我们通常会忽略常数,最终算法时间复杂度为O(1)。

总结

一个非常简单的面试题,竟然有好几种不同的解法。这才是算法与数据结构的魅力,欢迎大家关注我,共同学习,共同进步。大家的支持是我继续唠嗑的动力。同名公众号(沙茶敏碎碎念)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/486679.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蜂鸟开发板 linux,蜂鸟E203系列——Linux下运行hello world例程

创建程序在 ~/hbird-e-sdk-master/software 路径下创建一个“helloworld”中文件夹在 ~/hbird-e-sdk-master/software/helloworld 路径下创建文件“helloworld.c”内容如下:#includeint main(void){printf("hello world!");printf(…

全景解密量子信息技术:高层集中学习,国家战略,三大领域一文看懂

来源:智东西 内参来源:中国信通院 IPRdaily中文网10月16日下午,高层就量子科技研究相关前景举行了一次会议,强调当今世界正经历百年未有之大变局,科技创新是其中一个关键变量。要充分认识推动量子科技发展的重要性&am…

mac怎么查看gitlab的注册邮箱_163电子邮箱怎么注册申请?手机号注册电子邮箱的小技巧...

电子邮箱帮助我们实现了无纸化,无需手写信件,通过电脑、手机输入,即可与收件人在网络上进行联系。电子邮箱的兴起,对于人与人之间的沟通和交流,增加了便捷性,促进了社会的发展与进步。目前的邮箱中&#xf…

c语言 switch案例,c语言switch case语句使用例子

c语言switch case语句使用例子发布时间:2020-04-23 11:48:53来源:亿速云阅读:421作者:小新这篇文章主要为大家详细介绍了c语言switch case语句使用例子,文中示例代码介绍的非常详细,具有一定的参考价值&…

深度学习未来的三种方式

来源:海豚数据科学实验室深度学习的未来在于这三种学习模式,而且它们彼此之间密切相关:混合学习——现代深度学习方法如何跨越监督学习和非监督学习之间的边界,以适应大量未使用的无标签数据?复合学习——如何以创造性…

android ocr识别源码_身份证识别OCR解决手动输入繁琐问题

随着互联网金融的的发展,越来越多的互联网金融公司都推出了自己的金融APP,这些APP都涉及到个人身份证信息的输入认证,如果手动去输入身份证号码和姓名,速度非常慢,且用户体验非常差。为了提高在手机移动终端上输入身份…

什么是内卷?华为内部这篇文章读懂

来源:互联网坊间八卦(ID:kekesil)内卷的意思是明明已经靠近边界有个天花板,但却又不断自我激发,繁复化、精致化。概念的含糊其辞是无效讨论和跌入焦虑自我再生产困境的原因之一。判断内卷还是良性竞争的前置问题是回答…

锁屏界面显示某些设置已隐藏_iOS 14 隐藏功能,只要轻点手机背面就能截屏

关于 iOS 14 系统的一些功能我也为大家介绍了一些,iOS 14 已发布,界面大更新!其实除了之外,iOS 14 系统还有许多隐藏的功能。那么今天我就为大家介绍 iOS 14 系统的隐藏功能之一:轻点背面。话不多说,我们先…

分享丨强化学习是针对优化数据的监督学习?

来源:AI科技大本营作者 | Ben Eysenbach、Aviral Kumar、Abhishek Gupta 编译 | 凯隐出品 | AI科技大本营(ID:rgznai100)强化学习(RL)可以从两个不同的视角来看待:优化和动态规划。其中,诸如REI…

stm32l0的停止模式怎么唤醒_手把手教你怎么利用旧电脑搭建NAS组建自己的黑群晖...

手把手教你怎么利用旧电脑搭建NAS组建自己的黑群晖Synology群晖科技(Synology )创立于 2000 年,自始便专注于打造高效能、可靠、功能丰富且绿色环保的 NAS 服务器,是全球少数几家以单纯的提供网络存储解决方案获得世界认同的华人企…

有人说 GPT3 是“暴力美学”的结晶,它的工作原理你知道吗?| 动图详解

来源:CSDN如今,在科技领域掀起了一股GPT3的热潮。大规模语言模型(比如GPT3)的潜力惊艳了我们。虽然这些模型还没有成熟到大多数企业将之直接面对消费者,但却展示出一些智慧的火花,并让人坚信其将会加速自动…

git 生成ssh key_ubuntu git生成ssh key (公钥私钥)配置github或者码云

Git是分布式的代码管理工具,远程的代码管理是基于SSH的,所以要使用远程的Git则需要SSH的配置。github的SSH配置如下:设置Git的user name和email:git config --global user.name "xx"git config --global user.email &qu…

android圆形头像 demo,Android图像处理之绘制圆形头像

在Android中,绘制圆形和绘制图片都是很容易的事情,但是绘制圆形图片就有点难倒人了。以前为了偷懒就直接去github上找一个开源项目,后来才发现绘制圆形图片其实也是很简单的事。绘制圆形图片也需要两个步骤:绘制圆形和绘制图片&am…

芯片项目烂尾怎么办?国家发改委回应了!

来源:北京日报客户端芯片项目烂尾的报道近日引发关注。对此,国家发改委新闻发言人孟玮在今日(20日)上午举行的例行发布会上回应,将会同有关部门强化顶层设计,狠抓产业规划布局,努力维护产业发展…

idea中二级包为什么创建不了_IDEA通过Maven打包JavaFX工程(OpenJFX11)

1 概述 最近研究JFX,写出来了但是打包不了,这。。。尴尬。。。 IDEA的文档说只支持Java8打成jar包: 尝试过直接使用Maven插件的package,不行,也尝试过Build Artifacts,也不行,各种奇奇怪怪的问题…

鸿蒙系统发布会16号几点,华为鸿蒙手机系统正式定档发布,12月16日于我们见面...

#华为鸿蒙系统#大家都知道,华为手机已经无法预装谷歌GMS服务了,对于大部分海外用户来说,GMS服务还是相当重要的,谷歌全家桶内置了地图、搜索、视频娱乐等功能,但凡是搭载了安卓系统的智能手机,那么就无法离…

Gartner发布2021年重要战略科技趋势

来源:Gartner公司全球领先的信息技术研究和顾问公司Gartner于今日发布企业机构在2021年需要深挖的重要战略科技趋势。分析师们在本周举行的Gartner IT Symposium/Xpo大会美洲站虚拟会议上展示了自己的发现。Gartner研究副总裁Brian Burke表示:“各企业职…

pause pod 什么是pod_Kubernetes 自主式Pod清单 干货太多先马住慢慢看

在讲资源清单之前,先给大家介绍一下究竟什么是Kubernetes资源?有几种资源?① 资源分类:① 1 工作负载:pod、rs(ReplicasSet)、deploy(Deployment)、sts(StatefulSet)、ds(DaemonSet)、job、cronjob① 2 服务发现及负…

不会Python开发的运维终将被淘汰?

Python语言是一种面向对象、直译式计算机程序设计语言,由Guido van Rossum于1989年底发明。Python语法简捷而清晰,具有丰富和强大的类库,具有可扩展性和可嵌入性,是现代比较流行的语言。 一、最流行的语言 IEEE Spectrum 的数据记…

8大领域、6大机遇!读懂2020年AI医疗新风向

来源 | 工业互联网创新中心、36氪研究院编辑 | 蒲蒲蓝皮书如下未来智能实验室的主要工作包括:建立AI智能系统智商评测体系,开展世界人工智能智商评测;开展互联网(城市)云脑研究计划,构建互联网(…