ขึ้นอยู่กับข้อมูลของคุณ สถานการณ์ในกรณีที่เลวร้ายที่สุดคือตัวเลขที่กระจายอย่างสม่ำเสมอ
ในกรณีนี้คุณสามารถหาค่ามัธยฐานในเวลา O (N) ดังตัวอย่างนี้:
สมมติว่าตัวเลขของคุณคือ 2,7,5,10,1,6,4,4,6,10,4,7,1,8,4,9,9,3,4,3 (ช่วงคือ 1-10) .
เราสร้าง 3 ถัง: 1-3, 4-7, 8-10 สังเกตว่าด้านบนและด้านล่างมีขนาดเท่ากัน
เราเติมที่เก็บข้อมูลด้วยตัวเลขนับจำนวนตกในแต่ละค่าสูงสุดและต่ำสุด
- ต่ำ (5): 2,1,1,3,3 นาที 1 สูงสุด 3
- กลาง (10): 7,5,6,4,4,6,4,7,4,4 ขั้นต่ำ 4 สูงสุด 7
- สูง (5): 10, 10, 8, 9, 9, ต่ำสุด 8, สูงสุด 10
ค่าเฉลี่ยตกอยู่ในถังกลางเราไม่สนใจส่วนที่เหลือ
เราสร้าง 3 ที่เก็บ: 4, 5-6, 7 ต่ำจะเริ่มต้นด้วยการนับ 5 และสูงสุด 3 และสูงด้วยขั้นต่ำ 8 และจำนวน 5
สำหรับแต่ละหมายเลขเราจะนับจำนวนที่ตกในถังต่ำและสูงสูงสุดและต่ำสุดและเก็บถังกลางไว้
- เก่าต่ำ (5)
- ต่ำ (5): 4, 4, 4, 4, 4, สูงสุด 4
- กลาง (3): 5,6,6
- สูง (2): 7, 7, นาที 7
- สูงเก่า (5)
ตอนนี้เราสามารถคำนวณค่ามัธยฐานได้โดยตรงเรามีสถานการณ์เช่นนี้
old low low middle high old high
x x x x x 4 4 4 4 4 4 5 6 6 7 7 x x x x x
ดังนั้นค่ามัธยฐานคือ 4.5
สมมติว่าคุณทราบข้อมูลเล็กน้อยเกี่ยวกับการกระจายคุณสามารถปรับแต่งวิธีกำหนดช่วงเพื่อเพิ่มความเร็วได้ ไม่ว่าในกรณีใดประสิทธิภาพควรไปพร้อมกับ O (N) เนื่องจาก 1 + 1/3 + 1/9 ... = 1.5
คุณต้องมีค่าต่ำสุดและสูงสุดเนื่องจากกรณีขอบ (เช่นถ้าค่ามัธยฐานเป็นค่าเฉลี่ยระหว่างค่าสูงสุดของค่าต่ำสุดเก่ากับองค์ประกอบถัดไป)
การดำเนินการทั้งหมดเหล่านี้สามารถขนานกันได้คุณสามารถให้ 1/100 ของข้อมูลกับคอมพิวเตอร์แต่ละเครื่องและคำนวณ 3 ที่เก็บข้อมูลในแต่ละโหนดจากนั้นกระจายที่เก็บข้อมูลที่คุณเก็บไว้ สิ่งนี้ทำให้คุณใช้เครือข่ายได้อย่างมีประสิทธิภาพอีกครั้งเนื่องจากแต่ละหมายเลขมีการส่งผ่านโดยเฉลี่ย 1.5 ครั้ง (ดังนั้น O (N)) คุณสามารถเอาชนะได้หากคุณส่งเฉพาะตัวเลขที่น้อยที่สุดระหว่างโหนด (เช่นถ้าโหนด 1 มี 100 หมายเลขและโหนด 2 มี 150 หมายเลขดังนั้นโหนด 2 สามารถให้ 25 หมายเลขไปยังโหนด 1)
หากคุณไม่ทราบข้อมูลเพิ่มเติมเกี่ยวกับการกระจายฉันสงสัยว่าคุณทำได้ดีกว่า O (N) ที่นี่เพราะคุณต้องนับองค์ประกอบอย่างน้อยหนึ่งครั้ง