全网首发:12306抢票算法大曝光?(十张图搞定)

article/2025/8/19 20:24:54

前言

相信大家都有过抢票、刷票的经验,每年年底,这都是一场盛宴。

然而,你有没有想过12306的抢票算法是怎么实现的呢?

没有吧,想过,还是没有头绪?

今天,我们就来曝光让人又爱又恨的12306是如何实现抢票的。

位运算回顾

我们知道计算机只能识别0和1,要操作这些0和1,只能通过位运算来进行,那么,一共有几种位运算呢?

让我们来回顾一下:

运算符号举例结果与& 1101
& 01100100或| 1101
& 01101111异或^ 1101
^ 01101011取反~11010010左移<<1101 << 111010带符号右移>>1101 >> 11110不带符号右移>>>1101>>>10110

以上位运算以Java为例,其他语言中可能没有 >>> 操作。

OK,位运算的简单回顾就到这里,还有不懂的同学可以自行百度一下。

位图

虽然大部分语言都有提供位运算,但是,并没有提供一种类似于位数组的类型,要使用这些位运算,我们只能通过数字类型来实现,比如Java中的int/long等类型。

而这些数字类型的数组,我们一般可以称之为“位图”(BitMap)。

比如,我们需要使用128位的内存,可以申请包含两个long类型的数组long[] bitmap = new long[2];。

不过,位图有什么用呢?

有大用处哦,比如,我们要统计某个用户一年的活跃度,就可以使用位图来实现。

一年有365天,一个long类型可以表示64位,365/64=6,只需要6个long类型就可以记录一个用户一年的活跃情况,怎么记录呢?

很简单,初始时,位图中所有位都是0,当这个用户某天登录了,就在位图中找到这天,把其位变成1,一年下来,这张位图就记录了这个用户哪些天登录了,统计这个位图中1的数量,除以365,就得到了他的活跃度。
在这里插入图片描述

OK,这只是位图的一个很简单的用法,位图还有很多高级的用法,比如统计活跃用户数、限流、权限控制等,当然,还有我们今天要曝光的12306抢票算法。

12306抢票算法

我们知道,一列火车,有很多个座位,可以到很多站,以北京到广州的一列火车G67为例:
在这里插入图片描述

G67次列车一共有18个站,有的人可能到武汉就下车了,有的人可能到长沙下车,还有的人可能从武汉上车从衡山西下车,甚至还有的人从北京一直坐到广州,我们假设这趟列车一共有200个座位。

那么,如何实现合理的抢票策略,才能保证这趟列车能够坐最多的人?(没有站票)

什么叫做“坐最多的人”呢?假设针对10号位置,一个人从北京到武汉,另一个人从武汉到长沙,再一个人从长沙到广州,那针对这个位置全程可以坐3个人;针对另一个位置,一个人从北京到广州,那这个位置全程只能坐一个人。简单点说,就是针对一个特定的位置,两个人之间不能有交集,比如一个人从北京到长沙,另一个人从武汉到广州,那这两个人不能安排到同一个位置上。

在这里插入图片描述

OK,先给你一分钟时间思考一下,先别急着往下看哦。

好了,一分钟时间已到,让我们继续。

首先,让我们回顾下G67这趟列车的信息:一共18个站,一共200个座位。

为了方便讲解和画图,我们假设它只有 北京、信阳、武汉、岳阳、长沙、广州 6个站,一共有8个座位。

针对这样的信息,我们可以这样来实现抢票策略:

1.创建5个位图,每个位图的大小为8位,初始时,每个位的值都是0。为什么是5个位图呢?因为到站就下车了,而广州站是终点站,到站全部人都得下车。比如,一个人从北京到武汉,他到武汉就下车了,所以,它不会占用武汉的位置。

2.把抢票逻辑放在单线程中来处理,单线程的好处是不用考虑并发问题,没有CPU上下文切换的问题等,而且整个操作都是CPU操作,速度很快,使用单线程效率更高。当然,我们还有更好的选择——Redis,Redis本身就是单线程处理的,而且它天然支持BitMap,速度又快又好,有兴趣的同学可以了解一下Redis中的BitMap。

3.假设第一个人的请求过来了,他要抢从北京到武汉的票,此时,我们只需要把北京和信阳两个位图做“与”运算,结果中,所有0的位置都表示可抢的位置,在这些位置中随机返回一个即可,并把此位置在北京和信阳这两个位图中标记为1,表示此位置在北京和信阳有人占用了。(武汉为什么不参与运算了,前面讲过了,这个人到武汉就下车了。)假设,此人最后的座位是2号,那么运算之后,各位图的情况如下:

4.接着,第二个人的请求过来了,假设他要从信阳到长沙,此时,需要把信阳、武汉和岳阳三个位图做“与”运算:假设,此人最后的座位是4号,那么,运算之后,各位图的情况如下:

5.然后,第三个人的请求来了,假设他要从北京到广州,此时,把所有5个位图做“与”运算:假设,此人最后的座位是1号位,那么,运算之后,各位图的情况如下:

6.OK,经过了多个人的请求之后,假设位图的情况变成了下面这样:请思考,此时,还能抢到从北京到广州的票吗?能?不能?回答能的同学,请从头再看一遍
好了,关于抢票算法我们就介绍到这里,你有没有Get到呢?或者你有没有更好的实现方法呢?

后记

本节,我们一起重温了位运算的操作,并学习了如何使用位图实现12306的抢票算法,关于位图,其实还有很多用途,比如,各种统计、限流、权限控制等。

收到最新情报:所有的递归都可以改写成非递归,怎么实现呢?有没有什么套路呢?下一节,我们一起来聊下这个话题。

原文链接:彤哥读源码


http://chatgpt.dhexx.cn/article/3okmnVJG.shtml

相关文章

12306自动刷票下单-查票下单

前言 上篇写了12306登录&#xff0c;隔了快一个月了&#xff0c;才准备动手写下单篇&#xff0c;真的要非常感谢博客园的 Asimple朋友&#xff0c;如果不是看到你的留言&#xff0c;我几乎都忘了要写下篇了&#xff0c;这一点在简书上就不好&#xff0c;都没人看/(ㄒoㄒ)/~~&a…

python+selenium实现12306自动登录刷票抢票(自己做黄牛?!)

上一篇写了12306的自动登录破解验证图https://blog.csdn.net/weixin_38283159/article/details/86498159 这篇算是它的后续部分加上了简单的刷票和预订功能&#xff0c;毕竟登录一下没什么实际价值嘛 博主曾被黄牛挣过一百大洋至今还耿耿于怀&#xff0c;不清楚他们到达是如何抢…

转载--12306刷票记

转载自&#xff1a;http://www.360doc.com/content/13/0122/17/453497_261790962.shtml 我也记不清啥时候动了写bot刷票这个念头的。原因很简单&#xff0c;我一直认为作为一个以代码谋生的不合格程序员&#xff0c;只有把生产工具用好&#xff0c;才能增加自己存在的价值。 首…

12306自动刷票下单-查票下单(二)

前言 上篇写了12306登录&#xff0c;隔了快一个月了&#xff0c;才准备动手写下单篇&#xff0c;真的要非常感谢博客园的 Asimple朋友&#xff0c;如果不是看到你的留言&#xff0c;我几乎都忘了要写下篇了&#xff0c;这一点在简书上就不好&#xff0c;都没人看/(ㄒoㄒ)/~~&a…

快过年了,Python实现12306查票以及自动购票....

马上就要过年了&#xff0c;听说还有人买不到票&#xff1f; 不要慌&#xff0c;今天咱们来用Python做一个自动查票抢票的脚本&#xff0c;24小时抢票&#xff0c;谁抢的过你&#xff01; python实现12306自动抢票查票 准备工作爬虫思路 准备工作 环境 Python 3.8Pycharm 插…

12306智能刷票,订票

乐在分享 python版本支持 2.7.10 - 2.7.15 依赖库 依赖若快 若快注册地址&#xff1a;http://www.ruokuai.com/client/index?6726 推荐用若快&#xff0c;打码兔平台已经关闭项目依赖包 requirements.txt安装方法 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r…

12306自动刷票下单-下单

12306自动刷票下单-登录 12306自动刷票下单-查票预定 下单 进入下单界面了 https://kyfw.12306.cn/otn/confirmPassenger/initDc 还有一个请求https://kyfw.12306.cn/otn/confirmPassenger/getPassengerDTOs 仔细看一下返回值&#xff0c;是我们常用联系人的信息&…

12306自动刷票下单-下单(三)

12306自动刷票下单-登录篇&#xff08;一&#xff09;12306自动刷票下单-查票预定&#xff08;二&#xff09; 下单 进入下单界面了 https://kyfw.12306.cn/otn/confirmPassenger/initDc 还有一个请求https://kyfw.12306.cn/otn/confirmPassenger/getPassengerDTOs 仔细看一下…

新手写的一个12306刷票工具

本来是去年打算写的一个12306的刷票工具&#xff0c;但是一直拖着没完成。过完年才搞好。其实也不算写好&#xff0c;只是感觉都过完年了这个东西都没多大意义&#xff0c;在说各大网站上都有这个功能。但就当记录一下吧。 刚开始写的时候困扰我的其实不是买票的流程&#xff0…

【使用教程】面向回家编程-12306智能刷票,订票

代码链接&#xff1a;https://github.com/testerSunshine/12306 实名感谢&#xff1a;testerSunshine 春运一票难求&#xff0c;很多朋友都听说了GitHub上的12306抢票神器&#xff0c;但苦于没有计算机编程基础或在使用过程中遇到暂时无法解决的问题导致抢票失败。特撰写本博…

12306自动刷票下单-登录篇(一)

12306网站推出图片验证码以后&#xff0c;对于抢票软件就提出了更高的要求&#xff0c;本篇并不涉及自动识别验证码登录&#xff08;主要是博主能力所限&#xff09;&#xff0c;提供一个途径-打码平台&#xff0c;这个几乎是可以破解所有验证码了&#xff0c;本篇主要是分享一…

12306刷票脚本

我也在刷票&#xff0c;不过发现12306还是发生了一些变化&#xff0c;在使用过程中&#xff0c;发现会自动退出登录。所以对脚本做了一些改动。顺便加了一些新的功能。具体如下&#xff1a; 防自动退出 添加刷到票后发起桌面通知 勾选某些类型的车 选择发站站点 …

c#模拟网页实现12306登陆、自动刷票、自动抢票完全篇

这一篇文章&#xff0c;我将从头到尾教大家使用c#模拟网页面登陆12306网站&#xff0c;自动刷票&#xff0c;选择订票人&#xff0c;到最后一步提交订单。研究过HTTP协议的童鞋们都知道&#xff0c;我们在访问网站时&#xff0c;是有两种方式的&#xff0c;POST和GET方式&#…

你距离家只差一个刷票脚本而已——12306刷票脚本升级版

马上就要回家了&#xff0c;票还没有。你是否用到了我去年发布的刷票脚本呢。传送门~ 我也在刷票&#xff0c;不过发现12306还是发生了一些变化&#xff0c;在使用过程中&#xff0c;发现会自动退出登录。所以对脚本做了一些改动。顺便加了一些新的功能。具体如下&#xff1a;…

搞技术的要不要学习财务知识

越是大型的集团或者企业&#xff0c;公司里面设立的部门就越多&#xff0c;也越细化&#xff0c;各部门之间既相互独立管理&#xff0c;又是相互的辅助支持&#xff0c;所以在工作中经常遇到这样的一个问题&#xff0c;就是做技术的要不要学习财务知识。这个问题其实就是把技术…

财务管理的一般常识

2019独角兽企业重金招聘Python工程师标准>>> 财务总监助理在协助财务总监做好企业理财规划与管理的时候需要首先了解以下的有关知识&#xff1a; —、财务和企业财务管理的概念 所谓“财务”&#xff0c;通俗地讲就是有关“钱财”的事务。从事一切事业都离不开钱财&…

财政系统基本知识

文章目录 一、基础数据1、单位管理修改2、部门信息 二、资产账1、卡片登记&#xff08;新增资产&#xff09;2、新增资产入账&#xff0c;也可批量入账3、卡片变动1&#xff09;普通信息变动 >>>普通信息确认2&#xff09;资产价值变动3&#xff09;资产大类变动4&…

身为企业管理者,必须了解的财务知识

财务管理工作是企业管理工作中的核心内容&#xff0c;也是企业管理工作中的难点内容&#xff0c;对于集团企业来讲更是任务艰巨而又问题频出。然而&#xff0c;信息时代的来临为解决和完善企业财务管理问题提供了新思路&#xff0c;就集团企业而言&#xff0c;财务管理信息化基…

业务:财务会计业务知识

一、引言 会计是以货币为主要计量单位&#xff0c;对企业、事业、机关、团体及其他经济组织的经济活动进行记录、计算、控制、分析、报告&#xff0c;以提供财务和管理信息的工作。会计的职能主要是反映和控制经济活动过程&#xff0c;保证会计信息的合法、真实、准确和完整&a…

软件测试分类

一、软件测试的分类 1、按开发阶段&#xff1a;单元测试、集成测试、系统测试、验收测试 2、按测试实施组织&#xff1a;α、β、第三方 3、按测试执行方式&#xff1a;静态测试、动态测试 4、按是否查看代码&#xff1a;黑盒测试、白盒测试、灰盒测试 5、按是否手工执行划分&a…