อัลกอริทึม P2 เป็นการค้นหาที่ดี มันทำงานได้โดยการประมาณหลายของ quantile, update พวกเขาเป็นระยะและใช้กำลังสอง (ไม่เชิงเส้นไม่ลูกบาศก์) การประมาณค่าเพื่อ quantile ผู้เขียนอ้างว่าการแก้ไขกำลังสองทำงานได้ดีกว่าในหางกว่าการแก้ไขเชิงเส้นและลูกบาศก์จะได้รับจุกจิกและยากเกินไป
คุณไม่ได้ระบุอย่างแน่ชัดว่าวิธีการนี้จะล้มเหลวอย่างไรสำหรับข้อมูล "แบบหนา" แต่ก็ง่ายที่จะคาดเดา: การประมาณปริมาณสูงสุดสำหรับการแจกแจงแบบหนาจะไม่เสถียรจนกว่าจะมีการรวบรวมข้อมูลจำนวนมาก แต่นี่จะเป็นปัญหา (ในระดับที่น้อยกว่า) แม้ว่าคุณจะเก็บข้อมูลทั้งหมดดังนั้นอย่าคาดหวังปาฏิหาริย์!
ในอัตราใด ๆ ทำไมไม่ตั้งเครื่องหมายเสริม - โทรให้ของพวกเขาและ --within ที่คุณเป็นอย่างมากบาง quantile จะนอนและการจัดเก็บข้อมูลทั้งหมดที่อยู่ระหว่างและ ? เมื่อบัฟเฟอร์ของคุณเต็มคุณจะต้องอัปเดตเครื่องหมายเหล่านี้ให้รักษาไว้เสมอ ขั้นตอนวิธีการง่ายๆในการทำเช่นนี้สามารถคิดค้นจากการรวมกันของ (ก) ประมาณการ P2 ปัจจุบันของ quantile และ (ข) เก็บไว้นับจำนวนของข้อมูลน้อยกว่าที่และจำนวนมากขึ้นข้อมูลกว่าx_6ในแบบนี้คุณสามารถประเมินควอนไทล์ได้อย่างแม่นยำและถ้าคุณมีชุดข้อมูลทั้งหมดที่มีอยู่เสมอ แต่คุณต้องการบัฟเฟอร์ที่ค่อนข้างเล็กx0x6x0x6x0≤ x6x0x6
โดยเฉพาะฉันกำลังเสนอโครงสร้างข้อมูลที่จะรักษาข้อมูลบางส่วนเกี่ยวกับลำดับของค่าข้อมูลx_n ที่นี่เป็นรายการที่เชื่อมโยงn x 1 , x 2 , … , x n y( k , y , n )nx1, x2, … , xnY
y =( x( n )[ k + 1 ]≤ x( n )[ k + 2 ]≤ ⋯ ≤ x( n )[ k + m ]) .
ในสัญลักษณ์นี้แสดงถึงเล็กที่สุดของค่าอ่านได้ เป็นค่าคงที่ขนาดของบัฟเฟอร์{y} i th n x m yx( n )[ i ]ผมTHn xม.Y
อัลกอริทึมเริ่มต้นด้วยการเติมด้วยค่าข้อมูลแรกที่พบและวางไว้ในลำดับที่เรียงน้อยที่สุดไปหามากที่สุด ให้เป็นปริมาณที่จะประมาณ เช่น = 0.99 เมื่ออ่านมีการกระทำที่เป็นไปได้สามประการ: m q q x n + 1Yม.QQxn + 1
หาก , เพิ่มk kxn + 1< x( n )[ k + 1 ]k
หากไม่ทำอะไรเลยxn + 1> x( n )[ k + m ]
มิฉะนั้นแทรก เข้า{y} yxn + 1Y
ในกรณีใด ๆ เพิ่มขึ้นnn
แทรกทำให้ขั้นตอนการเข้าเพื่อเรียงลำดับแล้วจะช่วยลดค่าใดค่าหนึ่งที่รุนแรงใน : y yxn + 1YY
ให้มีขนาดใหญ่เพียงพอขั้นตอนนี้จะกำหนดควอนตัมจริงของการแจกแจงที่มีความน่าจะเป็นสูง ในขั้นตอนใด ๆสามารถประมาณได้ตามปกติในแง่ของและ ซึ่งมีแนวโน้มที่จะอยู่ใน{y} (ฉันเชื่อว่าต้องปรับขนาดให้เหมือนสแควร์รูทของจำนวนข้อมูลสูงสุด ( ) แต่ฉันไม่ได้ทำการวิเคราะห์อย่างเข้มงวดเพื่อพิสูจน์ว่า) ในทุก ๆ วิธีอัลกอริทึมจะตรวจสอบว่ามันประสบความสำเร็จหรือไม่ เปรียบเทียบและกับ )ม.nx( n )[ ⌊ qn ⌋]x( n )[ ⌈ qn ⌉]Yม.ยังไม่มีข้อความk / n( k + m ) / nQ
การทดสอบที่มีมากถึง 100,000 ค่าโดยใช้และ (กรณีที่ยากที่สุด) บ่งชี้ว่าอัลกอริทึมนี้มีอัตราความสำเร็จ 99.5% ในการรับค่าที่ถูกต้องของ rfloor]} สำหรับสตรีมที่มีค่านั่นจะต้องใช้บัฟเฟอร์เพียงสองล้าน (แต่สามหรือสี่ล้านจะเป็นตัวเลือกที่ดีกว่า) ใช้เรียงรายการที่เชื่อมโยงเป็นทวีคูณสำหรับบัฟเฟอร์ต้อง =ความพยายามในขณะที่การระบุและการลบสูงสุดหรือต่ำสุดเป็นการดำเนินงาน โดยทั่วไปแล้วการแทรกที่มีราคาค่อนข้างสูงจะต้องทำเฉพาะm = 2 N--√x ( n ) [ ⌊ Q n ⌋ ] N = 10 12 O ( เข้าสู่ระบบ( √Q= .5x( n )[ ⌊ qn ⌋]ยังไม่มีข้อความ= 1012O ( บันทึก( N--√) )O ( บันทึก( N) )O ( 1 )O ( N--√)ครั้ง ดังนั้นต้นทุนการคำนวณของอัลกอริทึมนี้คือในเวลาและในที่เก็บข้อมูลO ( N+ N--√เข้าสู่ระบบ( N))=O(N)O(N−−√)