โครงสร้างข้อมูลใดจะเก็บช่วงจำนวนเต็มได้อย่างมีประสิทธิภาพ


10

ฉันต้องการเก็บสะสมจำนวนเต็มในช่วง 0 ถึง 65535 เพื่อที่ฉันจะสามารถทำสิ่งต่อไปนี้ได้อย่างรวดเร็ว:

  • ใส่จำนวนเต็มใหม่
  • แทรกช่วงของจำนวนเต็มต่อเนื่อง
  • ลบจำนวนเต็ม
  • ลบจำนวนเต็มทั้งหมดด้านล่างเป็นจำนวนเต็ม
  • ทดสอบว่ามีจำนวนเต็มหรือไม่

ข้อมูลของฉันมีคุณสมบัติที่มักจะมีจำนวนเต็มในคอลเลกชัน ตัวอย่างเช่นการรวบรวมอาจ ณ เวลาหนึ่งจะเป็น:

{ 121, 122, 123, 124, 3201, 3202, 5897, 8912, 8913, 8914, 18823, 18824, 40891 }

วิธีที่ง่ายที่สุดคือการใช้ต้นไม้ไบนารีแบบสมดุลเช่น C ++ std :: set อย่างไรก็ตามโดยที่ฉันไม่ได้ใช้ประโยชน์จากความจริงที่ว่าฉันมักจะมีจำนวนของตัวเลข บางทีอาจเป็นการดีกว่าที่จะเก็บสะสมของช่วง? แต่นั่นหมายความว่าช่วงจะต้องสามารถแยกย่อยได้ถ้าจำนวนเต็มที่อยู่ตรงกลางถูกลบออกหรือรวมเข้าด้วยกันถ้าช่องว่างระหว่างสองช่วงเต็ม

มีโครงสร้างข้อมูลใดที่มีอยู่ซึ่งเหมาะสำหรับปัญหานี้หรือไม่?

คำตอบ:


9

ฉันขอแนะนำให้คุณใช้แผนภูมิการค้นหาแบบไบนารี่เสริมเพื่อให้ใบไม้สามารถมีช่วงเวลา (จำนวนเต็มต่อเนื่อง) รักษาค่าคงที่ว่าช่วงเวลาไม่ทับซ้อนกันและเป็นไปตามลำดับ (ตามค่าคงที่ของแผนภูมิการค้นหา) (ซึ่งถือได้ว่าเป็นกรณีพิเศษของทรีช่วงเวลาหรือทรีเซกเมนต์สำหรับกรณีพิเศษที่ช่วงเวลาไม่ทับซ้อนกัน)

O(LGn)nn65535O(LGn)


5

ก่อนอื่นคำถามของคุณจะพูดไม่ดีมากหากไม่มีเหตุผลอื่นเพราะ "เร็ว" ไม่ได้มีความหมายอะไรมาก คุณจะต้องระบุเมตริกของความหมาย "ด่วน"

นอกเหนือจากนั้นเมื่อพยายามออกแบบปัญหาคุณต้องเข้าใจปัญหาก่อนเป็นอย่างดีและถามคำถามเพิ่มเติมจำนวนมาก คำถามที่เกี่ยวข้องในกรณีนี้ดูเหมือนจะเป็น (โดยไม่เรียงตามลำดับ):

  • การดำเนินการทั้งหมดเหล่านี้จะต้องรวดเร็วอย่างเท่าเทียมกันหรือมีความสำคัญมากกว่าการดำเนินการอื่นหรือไม่
  • มีข้อควรพิจารณาอื่น ๆ อีกไหม?
  • หน่วยความจำเป็นเรื่องที่กังวลหรือไม่?
  • ความสามารถในการดำเนินการเกี่ยวกับการแทรกการลบและการค้นหาจากหลายเธรดหรือไม่?
  • ภาระงานส่วนใหญ่มุ่งเน้นที่การแทรกหรือไม่ การลบ? ค้นหา?

[0,65535]

สำหรับการทำงานเพิ่มอีกนิดคุณสามารถประหยัดพื้นที่ได้ถ้าเป็นเรื่องที่ต้องกังวลเรื่องความเร็วด้วยการเก็บข้อมูลเป็นบิตในจำนวนเต็ม 8192 แม้ว่าในทางความคิดการดำเนินการจำนวนเต็มเดียวจะยังคงเป็นเวลาที่คงที่และการดำเนินการจำนวนเต็มในช่วงจะยังคงเป็นเวลาเชิงเส้นพวกเขาจะช้าลง

ดังนั้นถ้านี่เป็นปัญหาของคุณจริงๆฉันจะบอกว่าใช้อาเรย์แล้วย้ายไปที่อื่นสิ่งที่สำคัญกว่าด้วยรหัส

[0,65535]


3

ยู={0,...,ยู-1}O(เข้าสู่ระบบเข้าสู่ระบบยู)

ขึ้นอยู่กับโครงสร้างของข้อมูลของคุณอาจมีทางเลือกมากมายในการจัดเก็บข้อมูลของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.