请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

单表操作的实战问题

图片描述
老师,这是一张每日打卡的记录表,用户每天点一次打卡就会往这张表添加一条记录.假设当前用户的user_id = 1,如何查询该用户最长连续打了多少天的卡?
(我现在的做法是把该用户的所有打卡记录全部取出来放在代码层面循环遍历依据日期是否相邻以及是否打卡来计算连续打卡的最大天数.但是假如某些用户打卡了几千天,并且有很多用户同时查询,服务器的压力太过繁重,有什么更好的优化方法吗?)

正在回答

3回答

双越 2020-07-22 08:04:26

其实获取连续打开多少天,应该不麻烦。根据 user_id 搜索出该用户所有的打开记录,逆序排序,得到一个列表。

然后遍历这个列表,遇到 is_record 打卡了,就累加打卡次数。遇到 is_record 未打开,就清零打卡次数。

这样你会得到很多阶段性的打卡次数,得到一个数组,而数组中的最大值就是你要的结果。

以上逻辑,查询一遍数据库,遍历一遍查询结果即可,时间复杂度 O(n)

0 回复 有任何疑惑可以回复我~
  • 提问者 慕标4541063 #1
    我特意去学了一下时间复杂度,按照您说的思路确实是O(n).那是不是说后端编程里面复杂度是O(n)的算法完全可以接受,就算并发起来,一般的服务器都是扛得住的,编程人员不可以管它.
    回复 有任何疑惑可以回复我~ 2020-07-22 20:05:49
  • 双越 回复 提问者 慕标4541063 #2
    O(n) 是可以接受的。如果有高并发,你可以再考虑其他情况,例如加缓存、加机器等。
    回复 有任何疑惑可以回复我~ 2020-07-22 22:27:04
提问者 慕标4541063 2020-07-21 20:25:32

双越老师,我不太懂时间复杂度.但可以给你看下我是怎么实现得到最长连续打卡天数的方法.下面的这个函数存在的最大问题就是如果list这个数组很大比如上千那就要遍历好多次.一个用户查询就遍历这么多次,要是并发起来服务器压力肯定很大.双越老师你只需要说说你的想法,给个思路我就行了,感谢!

https://img1.sycdn.imooc.com//szimg/5f16e0190954691506380517.jpg

0 回复 有任何疑惑可以回复我~
  • 双越 #1
    遍历好多次,就是时间复杂度太高。PS:时间复杂度如果不懂的话,建议你去查一查,这还是挺重要的概念。
    回复 有任何疑惑可以回复我~ 2020-07-22 07:58:21
双越 2020-07-19 17:55:08

我先问一下,你觉得你的算法,时间复杂度是多少呢?


你先回复,然后我再说说我的想法。

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信