มีวิธีแก้ปัญหาที่แตกต่างกันจำนวนหนึ่งสำหรับการค้นหาค่ามัธยฐานจากการสตรีมข้อมูลฉันจะพูดคุยสั้น ๆ เกี่ยวกับพวกเขาในตอนท้ายของคำตอบ
คำถามเกี่ยวกับรายละเอียดของโซลูชันเฉพาะ (สูงสุด heap / min heap solution) และวิธีการทำงานของ heap based solution อธิบายไว้ด้านล่าง:
สำหรับองค์ประกอบสองรายการแรกเพิ่มขนาดเล็กลงหนึ่งใน maxHeap ด้านซ้ายและใหญ่กว่าไปยัง minHeap ทางด้านขวา จากนั้นประมวลผลสตรีมข้อมูลทีละรายการ
Step 1: Add next item to one of the heaps
if next item is smaller than maxHeap root add it to maxHeap,
else add it to minHeap
Step 2: Balance the heaps (after this step heaps will be either balanced or
one of them will contain 1 more item)
if number of elements in one of the heaps is greater than the other by
more than 1, remove the root element from the one containing more elements and
add to the other one
จากนั้นในเวลาใดก็ตามคุณสามารถคำนวณค่ามัธยฐานเช่นนี้:
If the heaps contain equal amount of elements;
median = (root of maxHeap + root of minHeap)/2
Else
median = root of the heap with more elements
ตอนนี้ฉันจะพูดถึงปัญหาโดยทั่วไปตามที่สัญญาไว้ในตอนต้นของคำตอบ การค้นหาค่ามัธยฐานที่ใช้งานจากสตรีมข้อมูลเป็นปัญหาที่ยากและการหาโซลูชันที่แน่นอนพร้อมกับข้อ จำกัด ของหน่วยความจำอย่างมีประสิทธิภาพอาจเป็นไปไม่ได้สำหรับกรณีทั่วไป ในทางกลับกันหากข้อมูลมีลักษณะบางอย่างที่เราสามารถใช้ประโยชน์ได้เราสามารถพัฒนาโซลูชั่นเฉพาะที่มีประสิทธิภาพ ตัวอย่างเช่นถ้าเรารู้ว่าข้อมูลเป็นประเภทที่สมบูรณ์เราสามารถใช้การเรียงลำดับการนับได้ซึ่งสามารถให้อัลกอริทึมเวลาคงที่ของหน่วยความจำคงที่แก่คุณได้ โซลูชันแบบอิงฮีปคือโซลูชันทั่วไปที่มีความหลากหลายกว่าเนื่องจากสามารถใช้กับชนิดข้อมูลอื่น ๆ (คู่) ได้เช่นกัน และสุดท้ายถ้าไม่จำเป็นต้องมีค่ามัธยฐานที่แน่นอนและการประมาณก็เพียงพอแล้วคุณสามารถลองประมาณฟังก์ชันความหนาแน่นของความน่าจะเป็นสำหรับข้อมูลและประเมินค่ามัธยฐานโดยใช้สิ่งนั้น