ผลรวมถ่วงน้ำหนักของหมายเลข N ล่าสุด


19

สมมติว่าเราได้รับตัวเลขในสตรีม หลังจากได้รับแต่ละตัวเลขแล้วจะต้องคำนวณผลรวมถ่วงน้ำหนักของตัวเลขสุดท้ายโดยที่น้ำหนักจะเหมือนกันเสมอ แต่ตามอำเภอใจN

ทำได้อย่างมีประสิทธิภาพแค่ไหนหากเราได้รับอนุญาตให้เก็บโครงสร้างข้อมูลไว้เพื่อช่วยในการคำนวณ? เราสามารถทำได้ดีกว่าคือการคำนวณผลรวมทุกครั้งที่ได้รับตัวเลขหรือไม่Θ(N)

ตัวอย่างเช่นสมมติว่าน้ำหนักที่มีw_4 เมื่อมาถึงจุดหนึ่งที่เรามีรายชื่อของที่ผ่านมาตัวเลขและน้ำหนักรวม dW=w1,w2,w3,w4NL1=a,b,c,d>S1=w1a+w2b+w3c+w4d

เมื่อจำนวนอีกจะได้รับเราปรับปรุงรายการที่จะได้รับและเราจำเป็นต้องคำนวณ .eL2=b,c,d,eS2=w1b+w2c+w3d+w4e

การพิจารณาโดยใช้ FFT กรณีพิเศษของปัญหานี้ดูเหมือนจะแก้ไขได้อย่างมีประสิทธิภาพโดยใช้การแปลงฟูริเยร์อย่างรวดเร็ว ที่นี่เราคำนวณจำนวนเงินชั่งน้ำหนักหลายรายการNกล่าวอีกนัยหนึ่งเราได้รับหมายเลขNและจากนั้นเราสามารถคำนวณผลรวมNน้ำหนักที่เกี่ยวข้อง การทำเช่นนี้เราต้องN-1หมายเลขที่ผ่านมา (ซึ่งจำนวนเงินที่ได้รับการคำนวณแล้ว) และยังไม่มีตัวเลขใหม่ทั้งหมด2N-1หมายเลขSNNNN1N2N1

ถ้าเวกเตอร์ของตัวเลขอินพุตและเวกเตอร์น้ำหนักWกำหนดสัมประสิทธิ์ของพหุนามP(x)และQ(x)โดยมีค่าสัมประสิทธิ์ในQกลับด้านเราจะเห็นว่าผลิตภัณฑ์P(x)×Q(x)เป็น พหุนามซึ่งมีค่าสัมประสิทธิ์อยู่ด้านหน้าxN1สูงสุดx2N2เป็นผลรวมของน้ำหนักที่เราแสวงหา สิ่งเหล่านี้สามารถคำนวณได้โดยใช้ FFT ในเวลาΘ(Nlog(N))ซึ่งทำให้เรามีเวลาเฉลี่ยΘ(log(N))ต่อจำนวนอินพุต

อย่างไรก็ตามนี่ไม่ใช่วิธีแก้ปัญหาตามที่ระบุไว้เนื่องจากจำเป็นต้องมีการคำนวณผลรวมถ่วงน้ำหนักอย่างมีประสิทธิภาพทุกครั้งที่รับหมายเลขใหม่ - เราไม่สามารถหน่วงเวลาการคำนวณได้


โปรดทราบว่าคุณสามารถใช้ LaTeX ได้ที่นี่
Raphael

อินพุตมาจากการกระจายที่รู้จักบ้างหรือไม่? พวกเขามีคุณสมบัติทางคณิตศาสตร์ที่เป็นประโยชน์หรือไม่? หากพวกเขาไม่ทำเช่นนั้นก็ไม่น่าเป็นไปได้ที่จะเป็นไปได้ (นอกเสียจากว่าใครบางคนสามารถหารูปแบบปิดที่เรียบร้อยซึ่งคำนวณได้แบบเชิงเส้น - ฉันไม่สามารถหาได้อย่างแน่นอน) การประมาณก็โอเคไหม นั่นอาจเป็นวิธีหนึ่งในการไปหากมีประโยชน์กับคุณเลย
RDN

ตัวกรอง FIRทำสิ่งนี้ดังนั้นการออกแบบจะมีความเกี่ยวข้อง
adrianN

@RDN ฉันตั้งคำถามนี้เป็นความอยากรู้อยากเห็นฉันไม่มีแอปพลิเคชันเชิงปฏิบัติในใจ
Ambroz Bizjak

คำตอบ:


6

นี่คือรายละเอียดของวิธีการของคุณ การวนซ้ำเราใช้อัลกอริทึม FFT เพื่อคำนวณค่าของการแปลงในเวลาโดยสมมติว่าค่าต่อมาเป็นศูนย์ เรากำลังคำนวณ ที่เป็นน้ำหนัก (หรือ น้ำหนักกลับ)เป็นลำดับใส่เป็นเวลาปัจจุบันและสำหรับเสื้อm O ( n บันทึกn ) m n - 1 i = 0 w ฉันa t - i + k ,mmO(nlogn)mW ฉัน n ฉันที

i=0n1wiati+k,0km1,
winaitt > tat=0t>t

สำหรับแต่ละการวนซ้ำต่อไปนี้เราสามารถคำนวณการบิดที่ต้องการในเวลา (การวนซ้ำที่ต้องการเวลา ) ดังนั้นครั้งตัดจำหน่ายเป็นm) นี้จะลดลงโดยการเลือกซึ่งจะช่วยให้ตัดจำหน่ายเวลาการทำงานของบันทึก)O ( m ) imO(m)iO ( m ) + O ( n บันทึกn / m ) m = O(i)O(m)+O(nlogn/m)m=nlognO(nlogn)

เราสามารถปรับปรุงสิ่งนี้ให้เป็นเวลาทำงานที่เลวร้ายที่สุดของโดยแบ่งการคำนวณออกเป็นส่วน ๆ แก้ไขและกำหนด แต่ละขึ้นอยู่กับปัจจัยการผลิตเพื่อที่จะสามารถคำนวณได้ในเวลาบันทึกเมตร) นอกจากนี้ยังได้รับสำหรับเราสามารถคำนวณบิดในเวลาm) แผนคือการรักษารายการ สำหรับแต่ละช่วงเวลาของmb T , p , o = m - 1 i = 0 w p m + i a T m - i + o ,O(nlogn)m C T , p 2mO(mlogm)

bT,p,o=i=0m1wpm+iaTmi+o,CT,p=bT,p,0,,bT,p,m1.
CT,p2mO(mlogm)Ct/mp,p0pn/m1O(n/m+m)m n /
Ct/mp,p,0pn/m1.
mอินพุตเราจำเป็นต้องอัปเดตของสิ่งเหล่านี้ การอัปเดตแต่ละครั้งต้องใช้เวลาดังนั้นหากเรากระจายการอัปเดตเหล่านี้อย่างสม่ำเสมอแต่ละอินพุตจะใช้งานเมตร) ร่วมกับการคำนวณบิดของตัวเองความซับซ้อนครั้งต่ออินพุตเป็นเมตร) เลือกเมื่อก่อนนี้จะช่วยให้n})O ( m log m ) O ( ( n / m 2 ) m log m ) = O (n/mO(mlogm)O((n/m2)mlogm)=O((n/m)logm)O((n/m)logm+m)m=nlognO(nlogn)

การแก้ปัญหาที่ยอดเยี่ยมขอบคุณฉันไม่แน่ใจจริงๆว่าสามารถทำได้
Ambroz Bizjak

และมันใช้งานได้! การติดตั้ง C: ideone.com/opuoMj
Ambroz Bizjak

Meh ผมก็หายไปที่บิตสุดท้ายของรหัสที่จริงทำให้มันเลิกคำนวณคงที่นี่ideone.com/GRXMAZ
Ambroz Bizjak

บนเครื่องของฉันอัลกอริทึมนี้เริ่มเร็วกว่าอัลกอริธึมธรรมดาที่ประมาณ 17,000 น้ำหนัก สำหรับน้ำหนักที่น้อยก็ช้า เกณฑ์มาตรฐาน: ideone.com/b7erxu
Ambroz Bizjak

น่าประทับใจมากที่คุณใช้งานจริง! คุณอาจต้องการที่จะเพิ่มประสิทธิภาพกว่าเมตรตัวเลือกเป็นเพียงคำแนะนำคร่าวๆและอาจไม่เหมาะสม คุณลองใช้อัลกอริทึมด้วยค่าต่าง ๆ ของหรือไม่? m = mm=nlognm
Yuval Filmus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.