Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

การออกแบบระบบการจัดเก็บบันทึกใน Python


สมมติว่าเรามีบันทึก ซึ่งแต่ละบันทึกมีรหัสและการประทับเวลาที่ไม่ซ้ำกัน Timestamp คือสตริงที่มีรูปแบบ:Year:Month:Day:Hour:Minute:Second ตัวอย่างเช่น 2019:01:01:23:59:59 โดเมนทั้งหมดเป็นเลขทศนิยมที่มีเบาะเป็นศูนย์

เราต้องออกแบบระบบการจัดเก็บบันทึกเพื่อใช้ฟังก์ชั่นต่อไปนี้ -

  • void Put(int id, string timestamp):การดำเนินการนี้จะนำ id และเวลาประทับที่ไม่ซ้ำกันของบันทึก และเก็บบันทึกในระบบจัดเก็บข้อมูล

  • int[] Retrieve(String start, String end, String granularity):สิ่งนี้จะส่งคืน id ของบันทึกที่มีการประทับเวลาอยู่ภายในช่วงตั้งแต่พารามิเตอร์เริ่มต้นจนถึงสิ้นสุด พารามิเตอร์ความละเอียดระบุระดับเวลาสำหรับการพิจารณา ตัวอย่างเช่น start ="2019:01:01:23:59:59" end ="2019:01:02:23:59:59" และ granularity ="Day" หมายความว่าเราจำเป็นต้องค้นหา บันทึกภายในช่วงตั้งแต่วันที่ 1 มกราคม 2019 ถึง 2 มกราคม 2019

ดังนั้นหากอินพุตเป็นแบบ

  • ใส่(1, "2019:01:01:23:59:59");

  • ใส่(2, "2019:01:01:22:59:59");

  • ใส่(3, "2018:01:01:00:00:00");

  • ดึงข้อมูล("2018:01:01:01:01:01","2019:01:01:23:00:00","ปี");

  • ดึงข้อมูล("2018:01:01:01:01:01","2019:01:01:23:00:00","ชั่วโมง");

ผลลัพธ์จะเป็น [1,2,3] เนื่องจากเราต้องส่งคืนบันทึกทั้งหมดภายในช่วง 2018 และ 2019 และ [1,2] เนื่องจากเราต้องส่งคืนบันทึกทั้งหมดตั้งแต่ 2018:01:01:01 ถึง 2019:01:01:23 โดยที่บันทึก 3 อยู่นอกช่วง

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • กำหนดตัวเริ่มต้น

  • บันทึก :=รายการใหม่

  • กำหนดฟังก์ชัน put() นี่จะใช้ id, timestamp

  • ใส่ id, timestamp ที่ท้ายบันทึก

  • กำหนดฟังก์ชั่นดึง () นี่จะใช้เวลา s, e, gra

  • index :=แผนที่เช่น {'Year':5, 'Month' :8, 'Day' :11, 'Hour' :14, 'Minute' :17, 'Second' :20}[gra]

  • start :=s[จากดัชนี 0 ถึงดัชนี]

  • end :=e[จากดัชนี 0 ถึงดัชนี]

  • return (tid สำหรับแต่ละ tid, timestamp ในบันทึกถ้า start <=timestamp[from index 0 to index] <=end)

ตัวอย่าง

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

class LogSystem(object):
   def __init__(self):
      self.logs = []
   def put(self, id, timestamp):
      self.logs.append((id, timestamp))
   def retrieve(self, s, e, gra):
      index = {'Year':5, 'Month' : 8, 'Day' : 11, 'Hour' : 14, 'Minute' : 17, 'Second' :20}[gra]
      start = s[:index]
      end = e[:index]
      return (tid for tid, timestamp in self.logs if start <= timestamp[:index] <= end)
ob = LogSystem()
ob.put(1, "2019:01:01:23:59:59")
ob.put(2, "2019:01:01:22:59:59")
ob.put(3, "2018:01:01:00:00:00")
print(list(ob.retrieve("2018:01:01:01:01:01","2019:01:01:23:00:00","Year")))
print(list(ob.retrieve("2018:01:01:01:01:01","2019:01:01:23:00:00","Hour")))

อินพุต

ob.put(1, "2019:01:01:23:59:59")
ob.put(2, "2019:01:01:22:59:59")
ob.put(3, "2018:01:01:00:00:00")
ob.retrieve("2018:01:01:01:01:01","2019:01:01:23:00:00","Year")
ob.retrieve("2018:01:01:01:01:01","2019:01:01:23:00:00","Hour")

ผลลัพธ์

[1, 2, 3]
[1, 2]