ฉันต้องการคำนวณค่ามัธยฐานที่ทำงานอยู่:
การป้อนข้อมูล: n
n ,เวกเตอร์x_n)kk ( x 1 , x 2 , … , x n )(x1,x2,…,xn) เอาท์พุท:เวกเตอร์ที่เป็นค่ามัธยฐานของK-1})( ปี1 , ปี2 , ... , Y n - k + 1 )
(y1,y2,…,yn−k+1) Y ฉันyi ( x ฉัน , x ฉัน+ 1 , ... , x ฉัน+ k - 1 )(xi,xi+1,…,xi+k−1)
(ไม่มีการโกงโดยประมาณฉันต้องการคำตอบที่ถูกต้ององค์ประกอบเป็นจำนวนเต็มขนาดใหญ่)x i
มีอัลกอริทึมเล็ก ๆ น้อย ๆ ที่รักษาโครงสร้างการค้นหาขนาด ; เวลาทำงานรวมเป็นO (n \ บันทึก k) (นี่คือ "แผนผังการค้นหา" หมายถึงโครงสร้างข้อมูลที่มีประสิทธิภาพบางอย่างที่รองรับการแทรกการลบและการสอบถามค่ามัธยฐานในเวลาลอการิทึม)k
อย่างไรก็ตามนี่มันช่างโง่เหลือเกินสำหรับฉัน เราจะเรียนรู้สถิติการสั่งซื้อทั้งหมดอย่างมีประสิทธิภาพภายในหน้าต่างทุกขนาดk
เราสามารถทำอะไรที่ดีกว่าอย่างมีนัยสำคัญได้หรือไม่
มีขอบเขตที่ต่ำกว่า (เช่นอัลกอริธึมเล็กน้อยนั้นเหมาะที่สุดสำหรับการเปรียบเทียบแบบจำลองหรือไม่)
แก้ไข: David Eppstein ให้ขอบเขตล่างที่ดีสำหรับรุ่นเปรียบเทียบ! ฉันสงสัยว่ามันเป็นไปได้ไหมที่จะทำสิ่งที่ฉลาดกว่าอัลกอริทึมเล็กน้อย?
ตัวอย่างเช่นเราสามารถทำอะไรบางอย่างตามเส้นเหล่านี้ได้หรือไม่: แบ่งเวกเตอร์อินพุตให้เป็นส่วนของขนาดk
แก้ไข 2: Saeed ต้องการเห็นเหตุผลบางอย่างว่าทำไมฉันคิดว่าการเรียงลำดับเร็วกว่าการค้นหาทรี นี่คือมาตรฐานที่รวดเร็วมากสำหรับk = 10 7
- ≈ 8s: การเรียงเวกเตอร์n / k
n/k มีองค์ประกอบkk แต่ละอัน - ≈ 10s: การจัดเรียงเวกเตอร์ที่มีองค์ประกอบn
n - ≈ 80:แทรกและลบในตารางแฮชขนาดn k
n k - ≈ 390S:แทรกและลบในต้นไม้ค้นหาสมดุลขนาดn k
n k
ตารางแฮชมีไว้เพื่อเปรียบเทียบเท่านั้น มันไม่มีประโยชน์โดยตรงในแอปพลิเคชันนี้
โดยสรุปเรามีความแตกต่างของประสิทธิภาพการเรียงลำดับกับการค้นหาทรีที่สมดุลเกือบ50เท่า และสิ่งที่ได้รับเลวร้ายมากถ้าเราเพิ่มkk
(รายละเอียดทางเทคนิค: ข้อมูล = จำนวนเต็ม 32- บิตสุ่มคอมพิวเตอร์ = แล็ปท็อปทันสมัยทั่วไปรหัสทดสอบถูกเขียนใน C ++ โดยใช้ไลบรารีมาตรฐาน (std :: sort) และโครงสร้างข้อมูล (std :: multiset, std :: unsorted_multiset) ฉันใช้คอมไพเลอร์ C ++ สองตัว (GCC และ Clang) และการใช้งานที่แตกต่างกันสองอย่างของไลบรารี่มาตรฐาน (libstdc ++ และ libc ++) ตามเนื้อผ้า std :: multiset ได้รับการนำมาใช้เป็นต้นไม้สีแดงดำที่ได้รับการปรับให้เหมาะสมที่สุด)