นี้เป็นกรณีพิเศษของขั้นตอนวิธีการเลือกที่สามารถหา TH องค์ประกอบที่เล็กของอาร์เรย์กับkเป็นครึ่งหนึ่งของขนาดของอาร์เรย์ที่ มีการนำไปใช้ที่เป็นเชิงเส้นในกรณีที่เลวร้ายที่สุดkk
อัลกอริทึมการเลือกทั่วไป
ครั้งแรกเรามาดูอัลกอริทึมfind-kth
ที่พบ TH องค์ประกอบที่เล็กของอาร์เรย์:k
find-kth(A, k)
pivot = random element of A
(L, R) = split(A, pivot)
if k = |L|+1, return pivot
if k ≤ |L| , return find-kth(L, k)
if k > |L|+1, return find-kth(R, k-(|L|+1))
ฟังก์ชั่นsplit(A, pivot)
ส่งกลับL,R
เช่นว่าองค์ประกอบทั้งหมดในR
มากกว่าpivot
และL
อื่น ๆ ทั้งหมด (ลบหนึ่งที่เกิดขึ้นpivot
) จากนั้นทั้งหมดจะทำซ้ำ
O(n)O(n2)
เดือยที่ดีกว่าคือค่ามัธยฐานของค่ามัธยฐานของอาร์เรย์ย่อยA
ขนาด 5 ทั้งหมดโดยใช้การเรียกโพรซีเดอร์บนอาร์เรย์ของค่ามัธยฐานเหล่านี้
find-kth(A, k)
B = [median(A[1], .., A[5]), median(A[6], .., A[10]), ..]
pivot = find-kth(B, |B|/2)
...
O(n)
โปรดทราบว่าเวลาส่วนใหญ่ที่ใช้การหมุนแบบสุ่มนั้นเร็วกว่า