ฉันต้องเขียน RandomQueue ที่อนุญาตให้ผนวกและลบแบบสุ่มใน Constant Time (O (1))
ความคิดแรกของฉันคือการสำรองข้อมูลด้วย Array บางประเภท (ฉันเลือก ArrayList) เนื่องจากอาร์เรย์มีการเข้าถึงอย่างต่อเนื่องผ่านดัชนี
เมื่อมองไปที่เอกสารแม้ว่าฉันรู้ว่าการเพิ่มเติมของ ArrayLists ถือเป็น Amortized Constant Time เนื่องจากการเพิ่มอาจต้องมีการจัดสรรใหม่ของอาเรย์พื้นฐานซึ่งก็คือ O (n)
Amortized Constant Time และ Constant Time มีประสิทธิภาพเหมือนกันหรือไม่หรือฉันต้องดูโครงสร้างบางอย่างที่ไม่ต้องการการจัดสรรใหม่อย่างสมบูรณ์ในทุก ๆ การเติม
ฉันถามสิ่งนี้เพราะโครงสร้างแบบอาเรย์กัน (ซึ่งเท่าที่ฉันรู้จะมีการเพิ่มค่าคงที่ตลอดเวลา) ฉันไม่สามารถคิดอะไรที่ตรงตามข้อกำหนด:
- ต้นไม้ใดก็ตามที่มีการเข้าถึง O (log n) จะดีที่สุด
- รายการที่เชื่อมโยงอาจมีการเพิ่ม O (1) (ถ้าการอ้างอิงไปยังหางถูกเก็บไว้) แต่การลบแบบสุ่มควรจะดีที่สุด O (n)
นี่คือคำถามเต็ม ในกรณีที่ฉันเคลือบรายละเอียดที่สำคัญบางอย่าง:
ออกแบบและใช้งาน RandomQueue นี่เป็นการใช้งานอินเตอร์เฟสคิวที่การดำเนินการ remove () ลบองค์ประกอบที่ถูกสุ่มเลือกอย่างสม่ำเสมอระหว่างองค์ประกอบทั้งหมดที่อยู่ในคิว (คิดว่า RandomQueue เป็นกระเป๋าที่เราสามารถเพิ่มองค์ประกอบหรือเข้าถึงและลบองค์ประกอบสุ่มบางอย่างสุ่มสี่สุ่มห้า) การดำเนินการเพิ่ม (x) และ remove () ใน RandomQueue ควรทำงานในเวลาคงที่ต่อการดำเนินการ
1/a
โอกาสสำหรับการดำเนินการ O (n)) แต่การเติบโตโดยปัจจัยคงที่a > 1
คือ O (1) ตัดจำหน่ายสำหรับการเพิ่ม: เรามี(1/a)^n
โอกาสของ O (n) การดำเนินงาน n
แต่น่าจะเป็นที่ใกล้ศูนย์ขนาดใหญ่