开发者(KaiFaX)

面向全栈工程师的开发者
专注于前端、Java/Python/Go/PHP的技术社区

导读

相信大家应该都有抢火车票的经验,每年年底,这都是一场盛宴。然而你有没有想过抢火车票这个算法是怎么实现的呢?应该没有吧,咱们今天就来一一探讨。其实并没有你想的那么难

bitmap与位运算

redis的bitmap基本使用咱们之前已经介绍过了,如果不是很熟悉的朋友可以看看这里

redis中setbit(位操作)的实际应用

今天在这里咱们主要是先回顾一下位运算

12306抢票算法详解

我们以北京到西安这趟高铁为例,比如我的路线就是从北京到西安,车上如果只剩最后一张票了,那么如果有其他人,在北京到西安这条路线之间买任何一站,那么我都是买不了票的,换句话说,对于单个座位来说,必须是起点到目的地之间的所有站,都没有人买的话,那么才能被算是有票状态。

所以我们可以尝试用bitmap结合上位操作来实现这种场景,以上述北京到西安为例,我们把问题简化

  • 比如一个火车上只有4个座位

  • 北京到西安,一共是4站,其实是三个区间的,分别为北京->石家庄,石家庄->郑州,郑州->西安

首先我们给每个区间构建一个空位图(0为有票,1为无票)

接下来,比如有人买了一张从北京到西安的票

买票这个动作,比如被分配到的座位是编号为1的座位,那么我们直接把北京到西安的所有站,1号座位全部设置为1,如下图

接下来又有人买了一张从石家庄到西安的票

比如这次分配的是座位2,那么我们把石家庄到西安的所有票全部设置为1就行了,如下图

如何知道还剩几张票?

其实解决这个问题很简单,我们直接把上述位图做一个或操作就可以了,因为或操作是必须全部都为0,才为0

或操作结果有几个0,则说明还剩几张票。

总结

其实解决这个问题主要在于位图的构建,因为火车票对于某一个座位来说,只要起点到终点中间某一个区间被占用了(置为1),那么整个座位都是无效的这个特点,很容易想到用或操作的结果来判断买票结果,我们这里只用了4位是为了方便说明问题,实际中应该是火车上有多少座位,位图的长度就应该是多少。好了,关于抢票算法我们就介绍到这里,你有没有Get到呢?或者你有没有更好的实现方法呢?


1. 回复“m”可以查看历史记录;

2. 回复“h”或者“帮助”,查看帮助;

开发者已开通多个技术群交流学习,请加若飞微信:1321113940  (暗号k)进开发群学习交流

说明:我们都是开发者。视频或文章来源于网络,如涉及版权或有误,请您与若飞(1321113940)联系,将在第一时间删除或者修改,谢谢!

开 发 者 : KaiFaX

面向全栈工程师的开发者
专注于前端、Java/Python/Go/PHP的技术社区

12306抢票算法居然被曝光了!!!居然是redis实现的相关推荐

  1. 12306抢票算法居然被曝光了,居然这么简单

    导读 相信大家应该都有抢火车票的经验,每年年底,这都是一场盛宴.然而你有没有想过抢火车票这个算法是怎么实现的呢? 应该没有吧,咱们今天就来一一探讨.其实并没有你想的那么难 bitmap与位运算 red ...

  2. 【数据结构与算法】7.位图算法、12306抢票算法

    前言 本文收录于专辑:http://dwz.win/HjK,点击解锁更多数据结构与算法的知识. 你好,我是彤哥,一个每天爬二十六层楼还不忘读源码的硬核男人. 相信大家都有过抢票.刷票的经验,每年年底, ...

  3. 四、基于HTTPS协议的12306抢票软件设计与实现--水平DNS并发查询分享

    一.基于HTTPS协议的12306抢票软件设计与实现--实现效果  二.基于HTTPS协议的12306抢票软件设计与实现--相关接口以及数据格式 三.基于HTTPS协议的12306抢票软件设计与实现- ...

  4. 12306 抢票,极限并发带来的思考

    点击上方"蓝色字体",选择"置顶或者星标" 你关注的就是我关心的! 来源:https://juejin.im/post/5d84e21f6fb9a06ac824 ...

  5. 同为高并发,微博热搜、天猫秒杀、12306 抢票有什么不同?

    同为高并发,微博热搜.天猫秒杀.12306 抢票有什么不同呢? 那接下来我们就来分别聊聊他们有什么特性~ 1.微博热搜 「微博热搜」是一个典型的读多写少场景,读今日的热点新闻,写自己的微博评论. 作为 ...

  6. python爬虫抢火车票_如何用python写一个简单的12306抢票软件|python 爬火车票 教程...

    python 如果抓取验证码图片 类似12306的登录验证码图片 这个以前做次.最大的麻烦是码的识别算法的识别率太低.12306那种网站登陆错3次就限制你20分钟.所以除非你有33%以上的识别率否则不 ...

  7. 12306抢票插件拖垮GitHub

    本文是作者在2013-01-16发布的一篇内容,搬来测试用:https://www.csdn.net/article/a/2813696 摘要:每逢佳节抢票难,这不,12306的一个抢票插件竟拖垮Gi ...

  8. 12306抢票带来的启示:看我如何用Go实现百万QPS的秒杀系统

    本文为开源实验性工程:"github.com/GuoZhaoran/spikeSystem"的配套文章,原作者:"绘你一世倾城",现为:猎豹移动php开发工程师 ...

  9. 如何定制一款12306抢票浏览器——完结篇

    差不多花了一个星期的业余时间去完成了相关的编码.最后也只是使用了5篇文章将整个大题流程和使用的关键技术介绍了一下.其中有很多酸甜苦辣,其中记忆最为深刻的就是我对图像做了处理后,tesseract-oc ...

最新文章

  1. PHP array_key_exists() 函数(判断某个数组中是否存在指定的 key)
  2. springboot 解决跨域问题
  3. Qt Creator设置调试器
  4. 动态规划--Leetcode63.不同路径二
  5. UIKeyboard键盘相关知识点
  6. 01 菜单栏和工具栏(一)
  7. java cas并发_java并发之CAS
  8. laravel mysql like_3分钟短文|Laravel 使用like匹配字符串的用法示例
  9. python之yield
  10. python DEA: 非径向距离函数(non-radial directional distance function)
  11. SOP封装和SOIC封装的区别
  12. nginx+php 完成 kod云搭建(ansible使用变量)
  13. 阿里云服务器出现 Resource stopwords not found. Please use the NLTK Downloader to obtain the resource:
  14. 视频监控在安防市场比重大 技术发展引出商机
  15. 什么模式下不可使用曝光补偿_摄影从零到入门 曝光模式与测光方法详解
  16. flask+echarts地图制作心得
  17. 【JavaWeb】AJAX
  18. 国科大学习资料--最优化计算方法(王晓)--第一次作业答案
  19. 微营销好标题之喜闻乐见(微营销标题吸引粉丝篇-6)
  20. MCU DC-DC数控电源

热门文章

  1. 女友要一个人去厦门旅游
  2. Windows Media Player播放器(VC++ 2008)
  3. piwik java访问api_piwik api 返回参数中文对应
  4. java -- 每日一题
  5. 我该怎么跟老板开口说辞职?
  6. python制作五子棋_python制作简单五子棋游戏
  7. 113.网络安全渗透测试—[权限提升篇11]—[Windows 2003 Mysql MOF提权]
  8. 【Node.js实战】一文带你开发博客项目(使用假数据处理)
  9. Beautiful Soup应用示例
  10. 注册自定义URL协议