ฉันเห็นใครบางคนวิเคราะห์ตรรกะของพื้นหลัง 12306 มาก่อน - การจองและยกเลิกการสมัครตั๋วรถไฟแตกต่างจากการช็อปปิ้งธรรมดา
ปัญหาหนึ่งคือตั๋วรถไฟสามารถขายได้ที่สถานีต่าง ๆ ตัวอย่างเช่นมีหลายสถานีระหว่างทางสำหรับตั๋วรถไฟจากปักกิ่งถึงเซี่ยงไฮ้เช่นปักกิ่ง-จินัน, จินนันจิง ... และอื่น ๆ วิธีการออกแบบรูปแบบข้อมูลเพื่อเข้าถึงตั๋วเหล่านี้เป็นปัญหา แทนที่จะเป็นปริมาณง่าย +-1
แนวคิดหนึ่งที่ดีมาก: ใช้สายไบนารีเพื่อเป็นตัวแทนตั๋วรถไฟ ตัวอย่างเช่นมี 10 สถานีจากปักกิ่งถึงเซี่ยงไฮ้และสถานะเริ่มต้นของตั๋วเต็มแสดงเป็น: '111111111';
หากขายตั๋วเต็มจำนวนตั๋วจะกลายเป็น '000000000';
หากคุณขายตั๋วครึ่งทางเช่น Beijing-Jinan สามสถานี (สถานีสถานีแรกที่สาม) ตั๋วจะกลายเป็น '0011111111';
หากคุณขายตั๋วครึ่งทางเช่น Xuzhou-Nanjing (หยุด 6-stop 9) ตั๋วก่อนหน้าจะกลายเป็น: '0011100011';
ตรรกะของตั๋วที่ไม่ได้สมัครเป็นเรื่องง่ายมาก หากฉันต้องการคืนเงินตั๋ว (Xuzhou-Nanjing) ฉันจะหาตั๋วแรกจากสระว่ายน้ำตั๋วและไม่สามารถซื้อได้
(Xuzhou-Nanjing) ตั๋วเปลี่ยนและก็โอเค (ทิศทางย้อนกลับของการซื้อตั๋ว) ตัวอย่างเช่นฉันพบตั๋วข้างบน '0011100011' ข้างต้น
หลังจากคืนเงินตั๋วตั๋วจะกลายเป็น (0011111111);
ตรรกะพื้นฐานอยู่ข้างต้น 12306 ต้องตรวจสอบให้แน่ใจว่ามีหลายทางเข้าและความสอดคล้องของข้อมูลในเวลาเดียวกันต้องใช้ตรรกะที่มีประสิทธิภาพมากในการจัดการการตรวจสอบตั๋ว
ว่ากันว่าจะมีคำขอ 200,000 ต่อวินาทีสำหรับการซื้อตั๋วและการคืนเงินของตั๋วในเวลาสูงสุด บันทึกโครงสร้างข้อมูลของตั๋วในหน่วยความจำ ไม่ใช่ฐานข้อมูล
การแยกข้อมูลขนาดเล็กและมีประสิทธิภาพกลายเป็นสิ่งสำคัญ
การคัดลอกรหัสมีดังนี้:
if (jQuery) {} else {
//document.write
-
ฟังก์ชันเซิร์ฟเวอร์ () {
var self = this;
self.ticketspool = [];
self._init = ฟังก์ชั่น (หมายเลข) {
if (typeof (number)! = 'number')
โยน ('ประเภทข้อผิดพลาด');
สำหรับ (i = 0; i <number; i ++) {
self.ticketspool.push (ตั๋วใหม่ ());
-
-
// ทิศทางไม่ว่าจะสามารถซื้อตั๋วได้และสามารถทำได้ผ่านและหรือการดำเนินการ
// ตัวอย่างเช่น: คำสั่ง O คือ Beijing-Jinan (001111111) และตั๋วบางใบคือ (0000000011)
// ตัวอย่างเช่น: คำสั่ง O คือ Beijing-Jinan (001111111) และตั๋วบางใบคือ (1111100011) (ขายใน Xuzhou-Nanjing) จากนั้นกลับมาจริง
self.canbuy = function (o, t) {
var _o = ''
สำหรับ (j = 0; j <o.length; j ++) {
_o += o [j] == '0'? 1: 0;
-
var r1 = (parseint (t.tic, 2) | parseint (o, 2)) & parseint (_o, 2);
var r2 = parseint (_o, 2);
return r1 == r2;
-
// ขายตั๋ว
self.pop1ticket = function (o) {
สำหรับ (i = 0; i <self.ticketspool.length; i ++) {
ถ้า (self.canbuy (o, self.ticketspool [i])) {
self.buy (self.ticketspool [i], o);
กลับฉัน;
-
-
กลับ -1;
-
// การใช้งานการขายตั๋วการเปลี่ยนสตริงไบนารีเช่น '11111111'-> '00111111';
self.buy = function (t, o) {
t.tic = (parseint (t.tic, 2) & parseint (o, 2)). toString (2);
//alert(t.tic);
-
// การสอบถามตั๋วที่เหลืออยู่
self.remaintics = function (o) {
count var = 0;
สำหรับ (i = 0; i <self.ticketspool.length; i ++) {
นับ += self.canbuy (o, self.ticketspool [i])? 1: 0;
-
นับคืน;
-
// การคืนเงินหรือการดำเนินการ
self.refund = function (o) {
สำหรับ (i = 0; i <self.ticketspool.length; i ++) {
if (! self.canbuy (o, self.ticketspool [i])) {
var _o = ''
สำหรับ (j = 0; j <o.length; j ++) {
_o += o [j] == '0'? 1: 0;
-
self.ticketspool [i] .tic = (parseint (self.ticketspool [i] .tic, 2) | parseint (_o, 2)). ToString (2);
กลับฉัน;
-
-
กลับ -1;
-
-
// รูปแบบข้อมูล: ตั๋ว
ตั๋วฟังก์ชั่น () {
var self = this;
// ตั๋วเป็นจุดเริ่มต้นของตั๋ว
self.tic = '1111111111';
-
// รูปแบบข้อมูล: คำสั่งซื้อ
คำสั่งฟังก์ชัน (จาก, ถึง) {
var self = this;
var s = '';
สำหรับ (i = 0; i <10; i ++) {
s += (i> = จาก && i <ถึง)? 0: 1;
-
กลับ s;
-
// 12306 หลังเวที
เซิร์ฟเวอร์ = เซิร์ฟเวอร์ใหม่ ();
// สถานะเริ่มต้นพูลตั๋วมีตั๋วเต็ม 400 ใบ
Server._init (400);